6

我很难构建我的 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 保留在原处。

我怀疑我将多个init .py 文件与 myutils/ 文件夹混淆了,但我不确定如何让这些文件正常工作。

--

还发现了这个有用的页面:

http://www.sourceweaver.com/musings/posts/python-namespace-packages

4

1 回答 1

7

如果我理解正确,那么您尝试设置的是名称空间包(一个包含其他单独安装的包的空包),这是setuptools 的一个功能

setuptools.setup()使用作为参数命名空间的包列表调用namespace_packages

setup(..., namespace_packages=['myutils'], ...)

然后,创建myutils/__init__.py仅包含以下内容:

__import__('pkg_resources').declare_namespace(__name__)

最后, inmyutils/a/__init__.pymyutils/b/__init__.pycall pkg_resources.declare_namespace('myutils'),它确保如果首先安装了较低级别的包,则创建命名空间。

我很确定它是这样工作的。我仍在学习 setuptools,所以如果我错了,非常感谢更正。

于 2011-08-24T21:15:27.223 回答