在Python egg中访问配置文件时遇到的问题

11 投票
2 回答
5306 浏览
提问于 2025-04-16 00:09

我有一个Python项目,结构如下:

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

我写了一个setup.py文件,把这个项目打包成一个egg,保持了相同的文件结构。(我用压缩软件查看时,结构看起来是一样的。)有趣的是,当我从我的IDE运行Python代码时,一切正常,可以访问配置文件;但当我尝试从另一个Python脚本中使用这个egg运行时,它似乎找不到egg里的配置文件。如果我把配置文件放在调用的Python脚本旁边的一个目录里(也就是在egg外面),那就可以正常工作了——但这样就失去了egg的意义,因为我想要的是一个自包含的egg,里面有程序的所有功能,可以随时调用。我可以使用egg里的任何类/模块,运行任何函数,只要它们不需要配置文件……但如果需要的话,egg就找不到这些文件,所以函数就不能正常工作。

如果能提供一些帮助,我会非常感激!我们对egg这个东西还比较陌生,不太知道该从哪里入手。

2 个回答

2

可以查看 Setuptools关于在运行时访问打包数据文件的讨论。如果你想让脚本在一个“蛋”(egg)里面正常工作,你需要用另一种方法来获取你的配置文件。此外,为了让这个方法有效,你可能需要把你的配置目录变成一个Python包,只需在里面放一个空的 __init__.py 文件就可以了。

12

问题是,配置文件现在不再是普通的文件了,而是打包在一个叫做“egg”的东西里。想要在文档中找到答案并不容易,但确实是有的。根据setuptools开发者指南的说法:

通常,现有的程序会通过一个叫做__file__的属性来找到数据文件的位置。不过,这种方法在使用PEP 302的导入钩子时就不太管用了,包括从压缩文件和Python Egg中导入时。

要访问这些文件,你需要按照资源管理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')

撰写回答