38

モジュール ディレクトリのサブディレクトリにいくつかのリソースを使用する Python モジュールがあります。スタックオーバーフローを検索して関連する回答を見つけた後、次のようなものを使用してモジュールをリソースに誘導することができました

import os
os.path.join(os.path.dirname(__file__), 'fonts/myfont.ttf')

これは、別の場所からモジュールを呼び出すと正常に機能しますが、現在の作業ディレクトリを変更した後にモジュールを呼び出すと機能しなくなります。問題は、の内容が__file__相対パスであることです。これは、ディレクトリを変更したという事実を考慮していません。

>>> mymodule.__file__
'mymodule/__init__.pyc'
>>> os.chdir('..')
>>> mymodule.__file__
'mymodule/__init__.pyc'

で絶対パスをエンコードする方法__file__、またはそれを禁止する方法、現在の作業ディレクトリが何であれ、モジュール内のリソースにアクセスするにはどうすればよいですか? ありがとう!

4

2 に答える 2

67

モジュール ディレクトリへの絶対パスをモジュールの先頭に保存します。

package_directory = os.path.dirname(os.path.abspath(__file__))

その後、これに基づいてリソースをロードしますpackage_directory

font_file = os.path.join(package_directory, 'fonts', 'myfont.ttf')

結局のところ、現在の作業ディレクトリのようなプロセス全体のリソースを変更しないでください。適切に作成されたプログラムでは、作業ディレクトリを実際に変更する必要はありませんos.chdir()

于 2010-11-15T17:55:19.877 に答える