在Python egg中访问配置文件时遇到的问题
我有一个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 个回答
可以查看 Setuptools关于在运行时访问打包数据文件的讨论。如果你想让脚本在一个“蛋”(egg)里面正常工作,你需要用另一种方法来获取你的配置文件。此外,为了让这个方法有效,你可能需要把你的配置目录变成一个Python包,只需在里面放一个空的 __init__.py
文件就可以了。
问题是,配置文件现在不再是普通的文件了,而是打包在一个叫做“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')