Pythonの相対パス [重複] 質問する

Pythonの相対パス [重複] 質問する

仕事で、コード ベース内のいくつかのテンプレート ファイルを現在のディレクトリにコピーする簡単なヘルパー スクリプトを作成しています。ただし、テンプレートが保存されているディレクトリへの絶対パスがありません。スクリプトからの相対パスはありますが、スクリプトを呼び出すと、現在の作業ディレクトリからの相対パスとして扱われます。この相対 URL がスクリプトの場所からのものであることを指定する方法はありますか?

ベストアンサー1

スクリプトを含むファイルでは、次のような操作を行います。

import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'relative/path/to/file/you/want')

これで探しているファイルへの絶対パスが分かります。setuptoolsを使用している場合は、おそらくパッケージリソースAPIその代わり。

更新: ここでコメントに返信しているので、コード サンプルを貼り付けることができます。 :-)

常に利用できるわけではないと考えるのは正しいでしょうか__file__(たとえば、ファイルをインポートするのではなく直接実行する場合など)?

ファイルを直接実行するとおっしゃっている場合、スクリプトを意味していると思います__main__。もしそうなら、私のシステム (OS X 10.5.7 上の Python 2.5.1) ではそうではないようです。

#foo.py
import os
print os.getcwd()
print __file__

#in the interactive interpreter
>>> import foo
/Users/jason
foo.py

#and finally, at the shell:
~ % python foo.py
/Users/jason
foo.py

ただし、C 拡張機能にはいくつかの癖があることはわかっています__file__。たとえば、Mac では次の操作を実行できます。

>>> import collections #note that collections is a C extension in Python 2.5
>>> collections.__file__
'/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-
dynload/collections.so'

ただし、これにより Windows マシンで例外が発生します。

おすすめ記事