3

这与我之前的一个问题有关。

我了解如何存储和读取配置文件。有诸如ConfigParserConfigObj之类的选择。

考虑这个假设的“eggs”模块的结构:

蛋/
  常见的/
    __init__.py
    配置文件
  富/
    __init__.py
    一个.py

'eggs.foo.a' 需要一些配置信息。我目前正在做的是,在'a'中,

导入 egg.common.config
. 这样做的一个问题是,如果将“a”移动到模块树中的更深层次,则相对导入会中断。绝对导入不会,但它们要求您的模块位于 PYTHONPATH 上。

上述绝对导入的一个可能替代方案是相对导入。因此,在“a”中,

导入 .common.config

在不讨论相对进口与绝对进口的优点的情况下,我想知道其他可能的解决方案吗?

编辑 - 删除了 VCS 上下文

4

5 回答 5

2

“导入......要求你的模块在你的 PYTHONPATH 上”

正确的。

那么,设置有什么问题PYTHONPATH呢?

于 2008-12-06T14:41:43.233 回答
0

You can trick the import mechanism, by adding each subdirectory to egg/__init__.py:

__path__.append(__path__[0]+"\\common")
__path__.append(__path__[0]+"\\foo")

then, you simply import all modules from the egg namespace; e.g. import egg.bar (provided you have file egg/foo/bar.py).
Note that foo and common should not be a package - in other words, they should not contain __init__.py file.

This solution completely solves the issue of eventually moving files around; however it flattens the namespace and therefore it may not be as good, especially in big projects - personally, I prefer full name resolution.

于 2008-12-07T00:19:24.970 回答
0

我正在考虑一种更“基于推送”的解决方案。不要导入共享对象(无论是用于配置,还是某种实用功能),而是让顶层init导出它,然后每个中间init从上层导入它,然后立即重新导出它。

我不确定我的python术语是否正确,如果我错了,请纠正我。

像这样,任何需要使用共享对象(在本示例的上下文中表示配置信息)的模块只需在其自身级别从init导入它。

这听起来合理/可行吗?

于 2008-12-06T04:38:19.287 回答
0

来自pkg_resources的 require 语句可能是您需要的。

于 2008-12-06T02:35:54.447 回答
0

正如我从这个问题和以前的问题中了解到的那样,您只需要一条路径即可sys.pathgit如果我们在任何时候只签出一个分支(单个工作目录)时谈论VCS(在上一个问题中提到)。您可以随意切换、合并分支。

于 2008-12-06T02:41:41.003 回答