2

我已经创建了 python 模块,但它们位于不同的目录中。

/xml/xmlcreator.py
/tasklist/tasks.py

在这里,tasks.py 正在尝试导入 xmlcreator,但两者都在不同的路径中。一种方法是在 Pythonpath 中包含 xmlcreator.py。但是,考虑到我将发布代码,这似乎不是这里建议的正确方法。因此,我如何包含 xmlcreator 或更确切地说是我可能编写的任何模块,这些模块将位于各种目录和子目录中?

4

3 回答 3

2

你打算单独发布两个模块还是一起发布在一个包中?

如果是前者,那么您可能希望您的用户安装您的 xml 模块(我会称它为别的 :),以便默认情况下它已经在 Python 的路径上,并将其声明为任务列表的依赖项模块。

如果两者都作为捆绑分发,那么相对导入似乎是最好的选择,因为您可以控制路径相对于彼此的位置。

于 2012-05-14T20:59:19.667 回答
2

最好的方法是在您定义的单个顶级包中创建子包。然后,您将它们一起装在一个包裹中。如果您正在使用 setuptools/Distribute 并且想要单独分发它们,那么您还可以定义一个“namspace 包”,这些包将被安装在其中。您不需要使用任何丑陋的 sys.path hacks。

制作这样的目录树:

mypackage/__init__.py
mypackage/xml/__init__.py
mypackage/xml/xmlcreator.py
mypackage/tasklist/__init__.py
mypackage/tasklist/tasks.py

__init__.py文件可能为空。他们将目录定义为 Python 将在其中搜索的包。

除非你想使用命名空间包,mypackage/__init__.py否则应该包含:

__import__('pkg_resources').declare_namespace(__name__)

您的setup.py文件包含:

...
namespace_packages=["mypackage"],
...

然后在您的代码中:

from mypackage.xml import xmlcreator
from mypackage.tasklist import tasks

将它们带到您需要的任何地方。在这种情况下,您只需要使一个名称全局唯一,即mypackage名称。

为了开发代码,您可以将包置于“开发模式”,方法是

python setup.py develop --user

这将设置本地 python 环境以在您的工作区中查找您的包。

于 2012-05-14T21:14:22.473 回答
0

当我开始一个新的 Python 项目时,我会立即编写它setup.py声明我的 Python modules/packages,这样我就可以:

python setup.py develop

一切都神奇地添加到了我的 PYTHONPATH 中。如果您从 virtualenv 中执行它会更好,因为您不需要在系统范围内安装它。

这里有更多关于它的信息:

http://packages.python.org/distribute/setuptools.html#development-mode

于 2012-05-14T21:07:51.360 回答