Как использовать относительный путь в модуле Python, когда CWD изменился?

StackOverflow https://stackoverflow.com/questions/4187300

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top