Проблема доступа к файлам конфигурации в яйце Python - PullRequest
10 голосов
/ 18 июня 2010

У меня есть проект 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 ]

11 голосов
/ 18 июня 2010

Проблема в том, что файлы конфигурации больше не являются файлами - они упакованы в яйцо.Это не легко найти ответ в документах, но он есть.Из руководства разработчика 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')
2 голосов
/ 18 июня 2010

См. Обсуждение Setuptools о доступе к упакованным файлам данных во время выполнения . Вы должны получить в своем файле конфигурации другой путь , если вы хотите, чтобы скрипт работал внутри яйца. Кроме того, чтобы это работало, вам может потребоваться сделать каталог конфигурации пакетом Python, добавив пустой файл __init__.py.

...