访问Python egg中的配置文件时出现问题

时间:2010-06-18 16:14:35

标签: python file egg

我有一个Python项目,它具有以下结构:

package1
  class.py
  class2.py
  ...
package2
  otherClass.py
  otherClass2.py
  ...
config
  dev_settings.ini
  prod_settings.ini

我写了一个setup.py文件,将其转换为具有相同文件结构的egg。 (当我使用zip程序检查它时,结构看起来完全相同。)有趣的是,当我从IDE运行Python代码时,它工作正常,可以访问配置文件;但是当我尝试使用egg从不同的Python脚本运行它时,它似乎无法在egg中找到配置文件。如果我将配置文件放入相对于调用 Python脚本(鸡蛋外部)的目录中,它可以正常工作 - 但这样做会破坏拥有一个包含所有内容的自包含鸡蛋的目的程序的功能,可以从任何地方调用。我可以使用任何类/模块并运行egg中的任何函数,只要它们不使用配置文件......但如果它们这样做,则鸡蛋无法找到它们,因此这些函数不起作用。 / p>

任何帮助都会非常感激!我们对这里的鸡蛋有点新意,并不知道从哪里开始。

2 个答案:

答案 0 :(得分:11)

问题是,配置文件不再是文件 - 它们被打包在鸡蛋中。在文档中找到答案并不容易,但它就在那里。来自setuptools developer's guide

  

通常,现有程序会操纵包的__file__属性,以便找到数据文件的位置。但是,此操作与基于PEP 302的导入挂钩不兼容,包括从zip文件和Python Eggs导入。

要访问它们,您需要关注资源管理API的instructions

在我自己的代码中,我遇到了日志配置文件的问题。我成功地使用了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')

答案 1 :(得分:2)

Setuptools' discussion of accessing pacakged data files at runtime。如果您希望脚本在egg中运行,则必须获取配置文件a different way。此外,为了实现这一点,您可能需要通过抛出一个空的__init__.py文件使您的config目录成为Python包。