この質問のいくつかのバリエーションにも取り組みます。
- 呼び出されたスクリプトのパスを見つける
- 現在実行中のスクリプトのパスを見つける
- 呼び出されたスクリプトのディレクトリを見つける
(これらの質問のいくつかはSOで尋ねられましたが、重複として閉じられ、ここにリダイレクトされました。)
使用上の注意 __file__
インポートしたモジュールの場合:
import something
something.__file__
モジュールの絶対パスを返します。ただし、次のスクリプトfoo.pyがあるとします。
#foo.py
print '__file__', __file__
'python foo.py'で呼び出すと、単に 'foo.py'が返されます。シバンを追加する場合:
#!/usr/bin/python
#foo.py
print '__file__', __file__
./foo.pyを使用して呼び出すと、「./ foo.py」が返されます。別のディレクトリから呼び出し(たとえば、foo.pyをディレクトリbarに配置)、次のいずれかを呼び出します。
python bar/foo.py
またはシバンを追加してファイルを直接実行します:
bar/foo.py
'bar / foo.py'(相対パス)を返します。
ディレクトリを見つける
そこからディレクトリを取得するのはos.path.dirname(__file__)
難しいかもしれません。少なくとも私のシステムでは、ファイルと同じディレクトリから呼び出すと空の文字列が返されます。例:
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
出力されます:
__file__ is: foo.py
os.path.dirname(__file__) is:
つまり、空の文字列を返すため、現在のファイル(インポートされたモジュールのファイルではなく)に使用する場合は、信頼性が低いようです。これを回避するには、abspathの呼び出しでそれをラップできます。
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
これは次のようなものを出力します:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
abspath()はシンボリックリンクを解決しないことに注意してください。これを行う場合は、代わりにrealpath()を使用してください。たとえば、シンボリックリンクfile_import_testing_linkがfile_import_testing.pyを指すようにし、次の内容を含めます。
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
実行すると、次のような絶対パスが出力されます。
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link-> file_import_testing.py
検査を使用する
@SummerBreezeは、inspectモジュールの使用について言及しています。
インポートされたモジュールの場合、これはうまく機能するようで、非常に簡潔です:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
絶対パスを素直に返します。しかし、現在実行中のスクリプトのパスを見つけるために、それを使用する方法がわかりませんでした。