質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2615閲覧

Pythonで作曲をするための環境設定でエラーメッセージが出ます

SSDD

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/16 04:49

前提・実現したいこと

Pythonで人工知能の作曲をしたいと思い、
https://inglow.jp/techblog/python-scoremake/というサイトのプログラムを使ってみようと考えています。
以下のプログラムを実行するとエラーメッセージが出ます。
us.create()についてはalreadyと書かれているので一度実行したら必要ないのでしょうか
"file"の部分のエラーは、自分でもどうしたらよいかわかりません。

発生している問題・エラーメッセージ

UserSettingsException Traceback (most recent call last) <ipython-input-16-27ecf7b879ea> in <module> 2 from music21 import * 3 us = environment.UserSettings() ----> 4 us.create() #first time only 5 6 ~\anaconda3\lib\site-packages\music21\environment.py in create(self) 1328 self._environment.write() 1329 else: -> 1330 raise UserSettingsException( 1331 'An environment configuration file already exists; ' 1332 'simply set values to modify.') UserSettingsException: An environment configuration file already exists; simply set values to modify. と --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-17-51763a8c22a6> in <module> 18 #パスの生成 19 DS = os.sep ---> 20 bs = os.path.dirname(__file__) + DS 21 xmlpath = bs + 'musicxml_simple' + DS 22 NameError: name '__file__' is not defined の二つ

該当のソースコード

#最初に設定をする場合 from music21 import * us = environment.UserSettings() us.create() #first time only #デフォルトでインストールした場合(適宜パスを変更してください。) us['musescoreDirectPNGPath'] = 'C:/Program Files/MuseScore 3/bin/MuseScore3.exe' us['musicxmlPath'] = 'C:/Program Files/MuseScore 3/bin/MuseScore3.exe' from music21 import * environment.set("musescoreDirectPNGPath", "C:/Program Files/MuseScore 3/bin/MuseScore3.exe") environment.set("musicxmlPath", "C:/Program Files/MuseScore 3/bin/MuseScore3.exe") import music21 as m21 import os import glob #パスの生成 DS = os.sep bs = os.path.dirname(__file__) + DS xmlpath = bs + 'musicxml_simple' + DS #フォルダ内のxmlファイルを取得する xmls = glob.glob(xmlpath + "*.musicxml") for x in xmls: piece = m21.converter.parse(x)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2021/09/16 04:57

Jupyter Notebook/Labを使っていますか?
SSDD

2021/09/16 05:07

はい、使用しています
SSDD

2021/09/16 05:09

__file__のエラーに関して、自分なりに''で挟んでみたのですが、エラーは消えました。この解決方法は問題ないでしょうか
Daregada

2021/09/16 05:15

「bs = os.path.dirname('__file__') + DS」の次の行に「print(bs)」と入れてみれば分かりますが、それは単にエラーが出なくなっただけで、問題は解決していません。
SSDD

2021/09/16 05:24

#パスの生成 DS = os.sep bs = os.path.dirname(__file__) + DS print(bs) xmlpath = bs + 'musicxml_simple' + DS このような形でしょうか
Daregada

2021/09/16 06:00

os.path.dirname('__file__') + DS ですね。+の左側が空文字列''になり、右側がWindowsのパス区切り文字'\'になるので、表示は「\」だけになります。
guest

回答2

0

ベストアンサー

__file__には、実行中のPythonのファイル(拡張子.py)のパスが記録されています。Python 3.9以降では、フルパスが得られます。

__file__の使い道として、os.path.dirnameの引数に指定して「実行中のファイルの置かれたフォルダー(ディレクトリ)を得る」という使い方がよく見られます。

なぜ__file__が使われるのか

カレントフォルダー(カレントディレクトリ)と、実行中のファイルの置かれたフォルダーが一致しないことがあるため、「実行中のファイルが置かれたフォルダーを基準として、他のファイルを読み書きする」ときに使われます。

たとえば、WindowsのC:\Users\hogehoge\Codes\pythonというフォルダーに、以下の内容のファイルfugafuga.pyがあるとします。

Python

1import os 2 3print(__file__) 4print(os.path.dirname(__file__)) 5print(os.getcwd())

このファイルを、C:\Users\hogehoge\Codes\pythonフォルダーからpython fugafuga.pyのように実行すると、

result

1C:\Users\hogehoge\Codes\python\fugafuga.py 2C:\Users\hogehoge\Codes\python 3C:\Users\hogehoge\Codes\python

という結果が得られます。ファイルのフルパス、そのフォルダー部分、カレントフォルダーが順に表示されます。

いっぽう、C:\Users\hogehogeフォルダーからpython Codes\python\fugafuga.pyのように実行すると、

result

1C:\Users\hogehoge\Codes\python\fugafuga.py 2C:\Users\hogehoge\Codes\python 3C:\Users\hogehoge

という結果が得られます。os.getcwdで得られるのは「実行時のカレントフォルダー」で、実行中のファイルの置かれたフォルダーではないのです。

__file__が使えない状況

今回のように、Jupyter Notebook/Labでコードを実行する場合、実行中のファイル(拡張子.py)が存在しないため、__file__を参照するとNameErrorになります。

result

1NameError Traceback (most recent call last) 2<ipython-input-5-358d5687b810> in <module> 3----> 1 __file__ 4 5NameError: name '__file__' is not defined

また、Pythonの対話モード(ファイル名を付けないで実行し、プロンプト>>>に対してPythonのコードを入力できる状態)でも、同様にNameErrorになります。

Jupyterでは、現在のノート(拡張子.ipynb)が置かれたフォルダーがそのままカレントフォルダーになるため、__file__を使わなくてもノートと同じ場所にあるファイルをファイル名だけで読み書きできます。

補足: 今回のコードだと、bsを使わずにノートが置かれたフォルダーのファイルやフォルダーにアクセスできるので、以下のようにすればいいでしょう。

diff

1-xmlpath = bs + 'musicxml_simple' + DS 2+xmlpath = 'musicxml_simple' + DS

もちろん、読み書きするファイルをフルパスで指定すれば、どのような実行環境でも、対象となるフォルダーやファイルを一意に指定できます。

投稿2021/09/16 05:40

編集2021/09/16 06:02
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SSDD

2021/09/16 05:44

__file__についての分かりやすい解説ありがとうございます。納得しました。
guest

0

  • us.create()についてはalreadyと書かれているので一度実行したら必要ないのでしょうか

そのように読めます。
Jupyterの場合は実行したことが残っているのに、再度実行しているのではありませんか。

-- "file"の部分のエラーは、自分でもどうしたらよいかわかりません。

元のコードは、main.pyというファイルにソースコードを保存しておいて、shell(Windowsの場合はコマンドプロンプトなど)から

python

1python main.py

と実行することを想定して作られています。その場合

plain

1__file__

は、main.pyのフルパスが入ります。

Jupyterから実行したければいろいろと変更する必要があります。
変更方法がわからないのであれば、shellから実行したほうが速いでしょう。

どうしてもJupyterから実行したいのであれば、公式ドキュメント os.path --- 共通のパス名操作を勉強してください。

投稿2021/09/16 05:09

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SSDD

2021/09/16 05:45

了解しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問