Проблема доступа к файлам конфигурации в яйце Python
У меня есть проект Python, который имеет следующую структуру:
package1
class.py
class2.py
...
package2
otherClass.py
otherClass2.py
...
config
dev_settings.ini
prod_settings.ini
Я написал файл setup.py, который преобразует это в яйцо с той же файловой структурой. (Когда я изучаю его с помощью zip-программы, структура кажется идентичной.) Самое смешное, что когда я запускаю код Python из моей IDE, он работает нормально и может получить доступ к файлам конфигурации; но когда я пытаюсь запустить его из другого скрипта Python, используя яйцо, он не может найти файлы конфигурации в яйце. Если я помещаю файлы конфигурации в каталог, относящийся к вызывающему скрипту Python (внешнему по отношению к яйцу), он работает - но это своего рода поражает цель иметь автономное яйцо, которое обладает всеми функциями программы и может быть звонил откуда угодно. Я могу использовать любые классы / модули и запускать любые функции из яйца, если они не используют файлы конфигурации... но если они это делают, яйцо не может их найти, и поэтому функции не работают.
Любая помощь могла бы быть полезна! Мы здесь немного новички и не знаем, с чего начать.
2 ответа
Проблема в том, что файлы конфигурации больше не являются файлами - они упакованы в яйцо. Это не легко найти ответ в документации, но он есть. Из руководства разработчика setuptools:
Как правило, существующие программы манипулируют пакетом
__file__
атрибут для того, чтобы найти расположение файлов данных. Однако эти манипуляции не совместимы с хуками импорта на основе PEP 302, включая импорт из zip-файлов и яиц Python.
Чтобы получить к ним доступ, необходимо следовать инструкциям для API управления ресурсами.
В моем собственном коде у меня была эта проблема с файлом конфигурации регистрации. Я успешно использовал API следующим образом:
from pkg_resources import resource_stream
_log_config_file = 'logging.conf'
_log_config_location = resource_stream(__name__, _log_config_file)
logging.config.fileConfig(_log_config_location)
_log = logging.getLogger('package.module')
См. Обсуждение Setuptools о доступе к файлам данных в пакете во время выполнения. Вы должны получить свой файл конфигурации другим способом, если хотите, чтобы скрипт работал внутри яйца. Кроме того, чтобы это работало, вам может потребоваться сделать каталог конфигурации пакетом Python, добавив пустой __init__.py
файл.