Как использовать относительный путь в модуле Python, когда CWD изменился? - PullRequest
27 голосов
/ 15 ноября 2010

У меня есть модуль 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__или, если не учитывать, как я могу получить доступ к своим ресурсам в модуле, независимо от того, какой текущий рабочий каталог?Спасибо!

1 Ответ

47 голосов
/ 15 ноября 2010

Сохранить абсолютный путь к каталогу модуля в самом начале модуля:

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

После этого загрузите свои ресурсы на основе этого package_directory:

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

И, в конце концов, не модифицируйте ресурсы всего процесса, такие как текущий рабочий каталог. Нет необходимости менять рабочую директорию в хорошо написанной программе, поэтому избегайте os.chdir().

...