Python:多个包和多个setup.py文件
我在写Python的setup.py文件时遇到了一些困难,想让它按照我的想法来工作。我有一个包是这样设置的:
somestuff_root/
setup.py
myutils/
__init__.py
a/
__init__.py
somestuff.py
还有另一个包是这样设置的:
otherstuff_root/
setup.py
myutils/
__init__.py
b/
__init__.py
otherstuff.py
所以在我的site-packages/目录下的组织结构是这样的:
myutils/
a/
somestuff.py
b/
otherstuff.py
这正是我希望在用pip安装这两个包后看到的效果。
我的问题是,当我用pip卸载第二个包时,第一个包也被一起删掉了——这不是我想要的结果。我希望它只删除myutils.b,而保留myutils.a。
我怀疑是因为在myutils/文件夹里有多个init.py文件搞混了,但我不太确定还有什么其他方法可以让它们正常工作。
--
我还发现了这个有用的页面:
http://www.sourceweaver.com/musings/posts/python-namespace-packages
1 个回答
10
如果我理解得没错,你想要设置的是一个命名空间包(就是一个空包,里面可以包含其他单独安装的包),这是 setuptools 的一个功能。
你需要用一个包的列表来调用 setuptools.setup()
,这个列表是用来给 namespace_packages
参数的。
setup(..., namespace_packages=['myutils'], ...)
然后,创建一个 myutils/__init__.py
文件,里面只需要包含以下内容:
__import__('pkg_resources').declare_namespace(__name__)
最后,在 myutils/a/__init__.py
和 myutils/b/__init__.py
中调用 pkg_resources.declare_namespace('myutils')
,这样可以确保如果先安装了一个低级别的包,就会创建这个命名空间。
我觉得这就是它的工作原理。我还在学习 setuptools,如果我说错了,欢迎指正。