11

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

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

我编写了一个 setup.py 文件,将其转换为具有相同文件结构的鸡蛋。(当我使用 zip 程序检查它时,结构似乎相同。)有趣的是,当我从 IDE 运行 Python 代码时,它工作正常并且可以访问配置文件;但是当我尝试使用egg从不同的Python脚本运行它时,它似乎无法在egg中找到配置文件。如果我将配置文件放入与调用相关的目录中Python 脚本(在 egg 外部),它可以工作——但这​​有点违背了拥有一个独立的 egg 的目的,它具有程序的所有功能并且可以从任何地方调用。只要不使用配置文件,我就可以使用任何类/模块并从 egg 运行任何功能......但如果他们这样做,egg 将找不到它们,因此这些功能不起作用。

任何帮助将非常感激!我们对这里的鸡蛋有点陌生,真的不知道从哪里开始。

4

2 回答 2

12

问题是,配置文件不再是文件——它们被打包在鸡蛋中。在文档中找到答案并不容易,但它就在那里。从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')
于 2010-06-18T16:25:15.483 回答
2

请参阅Setuptools 关于在运行时访问打包数据文件的讨论。如果您希望脚本在鸡蛋中工作,您必须以不同的方式获取配置文件。此外,为了使其工作,您可能需要通过放入一个空__init__.py文件来使您的配置目录成为 Python 包。

于 2010-06-18T16:30:39.107 回答