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

Per*_*ell 8 python setuptools package name-conflict namespace-package

我想知道你想要使用相同基础包的子项目的正确/最简单/最pythonic方式.我们目前有这样的文件结构:

trunk\
    proj1\setup.py
          company_name\__init__.py + proj1's code
    proj2\setup.py
          company_name\__init__.py + proj2's code
Run Code Online (Sandbox Code Playgroud)

我们希望保持命名空间company_name对我们所有的项目都是通用的(也许这本身就是unpythonic?)但是当proj1和proj2安装在开发模式下时,第一个安装会被破坏.它看起来import company_name...很困惑在哪个company_name包中查找它并抓取第一个/最后一个/随机一个.

通常如何在更大的python项目中处理?是否可以通过构建某种巨型蛋的主干中的setup.py来解决这个问题?我没有在谷歌或堆栈上找到任何相关信息,所以任何信息甚至只是链接非常感谢!


编辑:我刚尝试在根文件夹中添加setup.py

...    
namespace_packages = ['company_name'],
package_dir = {'company_name' : ['proj1/company_name', 'proj2/company_name']}
...
Run Code Online (Sandbox Code Playgroud)

适当pkg_resources.declare_namespace(__name__)__init_.py文件,但./setup.py bdist_egg 只是给出:

company_name setup命令中的错误:分发包含名称空间包'company_name'的模块或包

Per*_*ell 7

虽然我不能保证我的解决方案的诡计,但我终于让不同的应用程序一起运行.我使用命名空间包在正确的轨道上,但我没有尝试在主干中有一个超级项目,而是namespace_packages在每个项目的setup.py中添加了这一行.这导致在一起安装时正常运行,company_name按预期共享命名空间.

任何想要进入这个问题的人都是一个合理的python解决方案,我仍然有兴趣听听这是"它的完成方式".感觉是对的,但那可能是因为它模仿了我比较习惯的java风格.

  • 这就是我设计`namespace_packages`关键字的原因,所以你确实以正确的方式做到了. (6认同)