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

11
我有一个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之外)的目录中,它就可以工作 - 但这有点违背了拥有完整功能且可以从任何地方调用的自包含egg的目的。只要它们不使用配置文件,我可以使用任何类/模块并运行任何函数...但是如果它们使用配置文件,egg就找不到它们,因此函数无法工作。

非常感谢任何帮助!我们在这里对egg还比较新,不知道该从哪里开始。

2个回答

12
问题在于配置文件不再是文件,而是被打包到egg文件中。虽然在文档中不容易找到答案,但确实存在。根据setuptools开发者指南的说法:

通常情况下,现有的程序通过操作包的__file__属性来查找数据文件的位置。但这种操作与PEP 302基于导入钩子的导入方式不兼容,包括从zip文件和Python Eggs导入。

要访问它们,您需要按照资源管理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')

1
我有点困惑...因为这些概念对我来说很新,所以可能有点慢,请耐心等待。我必须更改我的Python类中的代码,使用pkg_resources模块而不是硬编码来使用配置文件吗?我现在用于加载配置文件的行是config = ConfigParser.RawConfigParser() config.read("..\\config\\" + environment + "_settings.ini")...我应该将其更改为什么? - froadie
@froadie:正确的。你需要这样做:config.read(resource_stream(__name__, "..\\config\\" + environment + "_settings.ini")) 此外,你需要导入资源管理模块:from pkg_resources import resource_stream - ire_and_curses
我尝试了类似的东西 - config.read(pkg_resources.resource_filename(__name__, "..\\config\\" + environment + "_settings.ini"))(使用resource_filename而不是resource_stream,因为read需要文件名)- 当我运行它时它可以工作但是我仍然会在从egg调用它时遇到错误,虽然这次是一个新错误 - KeyError: 'myPackageName\\..\\config\\dev_settings.ini' - froadie
我通过将配置文件夹移动到实际使用它的包中来解决了这个问题。这样做是正确的吗?是否有任何方法可以在仍然将配置文件夹放在包级别上的情况下完成相同的事情? - froadie
你应该能够做到这一点。在第一个参数中,使用pkg_resources.resource_filename("your_base_package.config", environment + "_settings.ini")而不是使用__name__。然后,创建一个config/__init__.py文件。看看是否有效。(your_base_package是package1/package2/config的父级目录。如果父目录直接在PYTHONPATH上,只需在资源调用的第一个参数中使用"config")。 - Walter Mundt

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接