1. ホーム
  2. パイソン

[解決済み】Pythonの相対パスについて

2022-03-25 12:55:02

質問

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

解決方法を教えてください。

スクリプトのあるファイルで、次のようなことをしたい。

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

しかし、私は __file__ をC言語の拡張子で使用することができます。 例えば、私の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マシンでは、これは例外を発生させます。