次のようなコマンドを使用するだけで、現在実行中のPythonスクリプトと同じディレクトリにあるファイルを開いていました
open("Some file.txt", "r")
しかし、Windowsでスクリプトをダブルクリックして実行すると、間違ったディレクトリからファイルを開こうとすることがわかりました。
それ以来、私は次の形式のコマンドを使用しています
open(os.path.join(sys.path[0], "Some file.txt"), "r")
ファイルを開きたいときはいつでも。これは私の特定の使用法でsys.path[0]
は機能しますが、他のユースケースで失敗するかどうかはわかりません。
だから私の質問です:現在実行中のPythonスクリプトと同じディレクトリにあるファイルを開くための最良かつ最も信頼できる方法は何ですか?
これが私がこれまでに理解できたことです:
os.getcwd()
os.path.abspath('')
スクリプトディレクトリではなく、「現在の作業ディレクトリ」を返します。os.path.dirname(sys.argv[0])
そしてos.path.dirname(__file__)
、スクリプトの呼び出しに使用されるパスを返します。これは、相対パスでも、空白でもかまいません(スクリプトがcwdにある場合)。また、__file__
スクリプトがIDLEまたはPythonWinで実行されている場合も存在しません。sys.path[0]
そして、os.path.abspath(os.path.dirname(sys.argv[0]))
スクリプトのディレクトリを返すように見えます。この2つに違いがあるかどうかはわかりません。
編集:
私がやりたいことは、「含まれているモジュールと同じディレクトリにあるファイルを開く」と表現するほうがよいことに気づきました。つまり、別のディレクトリに書き込んだモジュールをインポートし、そのモジュールがファイルを開いた場合、モジュールのディレクトリでファイルを探します。私が見つけたものはそれを行うことができるとは思いません...
__file__
使用できない場合は、のsys.argv[0]
代わりに使用してくださいdirname(__file__)
。残りは期待どおりに動作するはずです。__file__
ライブラリコードでsys.argv[0]
は、特にサードパーティのスクリプトを介してインポートした場合、コードをまったく指さない可能性があるため、使用するのが好きです。