Python:多个包和多个setup.py文件

6 投票
1 回答
10890 浏览
提问于 2025-04-17 00:17

我在写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__.pymyutils/b/__init__.py 中调用 pkg_resources.declare_namespace('myutils'),这样可以确保如果先安装了一个低级别的包,就会创建这个命名空间。

我觉得这就是它的工作原理。我还在学习 setuptools,如果我说错了,欢迎指正。

撰写回答