我已经创建了 python 模块,但它们位于不同的目录中。
/xml/xmlcreator.py
/tasklist/tasks.py
在这里,tasks.py 正在尝试导入 xmlcreator,但两者都在不同的路径中。一种方法是在 Pythonpath 中包含 xmlcreator.py。但是,考虑到我将发布代码,这似乎不是这里建议的正确方法。因此,我如何包含 xmlcreator 或更确切地说是我可能编写的任何模块,这些模块将位于各种目录和子目录中?
你打算单独发布两个模块还是一起发布在一个包中?
如果是前者,那么您可能希望您的用户安装您的 xml 模块(我会称它为别的 :),以便默认情况下它已经在 Python 的路径上,并将其声明为任务列表的依赖项模块。
如果两者都作为捆绑分发,那么相对导入似乎是最好的选择,因为您可以控制路径相对于彼此的位置。
最好的方法是在您定义的单个顶级包中创建子包。然后,您将它们一起装在一个包裹中。如果您正在使用 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 环境以在您的工作区中查找您的包。
当我开始一个新的 Python 项目时,我会立即编写它setup.py
并声明我的 Python modules/packages,这样我就可以:
python setup.py develop
一切都神奇地添加到了我的 PYTHONPATH 中。如果您从 virtualenv 中执行它会更好,因为您不需要在系统范围内安装它。
这里有更多关于它的信息:
http://packages.python.org/distribute/setuptools.html#development-mode