Как использовать относительный путь в модуле Python, когда CWD изменился?
-
10-10-2019 - |
Вопрос
У меня есть модуль 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()
.