如何用setuptools管理多个Python子项目?

9 投票
1 回答
3173 浏览
提问于 2025-04-16 03:19

我在想,处理一些子项目时,怎样才能用最简单、最符合Python风格的方法来使用同一个基础包。我们现在的文件结构是这样的:

trunk\
    proj1\setup.py
          company_name\__init__.py + proj1's code
    proj2\setup.py
          company_name\__init__.py + proj2's code

我们希望所有项目都能共享一个叫做company_name的命名空间(也许这样做本身就不太符合Python的风格?),但当proj1和proj2同时以开发模式安装时,先安装的那个会出现问题。看起来import company_name...在选择哪个company_name包时会搞混,结果抓取了第一个、最后一个或者随机的一个。

在更大的Python项目中,通常是怎么处理这种情况的呢?是否可以通过在主目录下的setup.py来解决这个问题,制作一个类似“超级包”的东西?我在谷歌或StackOverflow上没有找到相关的信息,所以任何信息,甚至只是链接,都非常感谢!


补充:我刚刚尝试在根文件夹添加一个setup.py,内容是:

...    
namespace_packages = ['company_name'],
package_dir = {'company_name' : ['proj1/company_name', 'proj2/company_name']}
...

并在__init__.py文件中加上适当的pkg_resources.declare_namespace(__name__),但是运行./setup.py bdist_egg时只得到:

公司名称的设置命令出错:分发中没有模块或包用于命名空间包'company_name'

1 个回答

7

虽然我不能保证我的解决方案有多符合Python的风格,但我终于把不同的应用程序一起运行起来了。我之前在使用命名空间包的方向上是对的,但我没有试图把所有东西放在一个超级项目里,而是在每个单独项目的setup.py文件中添加了namespace_packages这一行。这样做后,当这些项目一起安装时,它们就能正常工作,像我想的那样共享company_name这个命名空间。

如果有人想讨论一下这是否是一个合理的Python解决方案,我还是很想听听大家的看法,看看这是不是“正确的做法”。我觉得这样做是对的,但可能是因为它跟我更熟悉的Java风格有点像。

撰写回答