导入我自己的模块时的 Python 路径问题.最好的方法是什么



我创建了python模块,但它们在不同的目录中。

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

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

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

如果是前者,那么你可能希望让你的用户安装你的xml模块(我会称之为其他东西:)因此,默认情况下,它已经在 Python 的路径上,并将其声明为 tasklist 模块的依赖项。

如果两者都作为捆绑包分发,则相对导入似乎是最佳选择,因为您可以控制路径之间的相对位置。

最好的方法是在您定义的单个顶级包中创建子包。然后,您将这些放在一个包裹中一起运送。 如果您使用的是setuptools/Distributed,并且想要单独分发它们,那么您还可以定义一个"namspace软件包",该软件包将安装在其中。你不需要使用任何丑陋的sys.path黑客。

像这样创建一个目录树:

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 环境以在工作区中查找包。

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

python setup.py develop

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

以下是更多关于它的信息:

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

最新更新