如何用setuptools管理多个Python子项目?
我在想,处理一些子项目时,怎样才能用最简单、最符合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 个回答
虽然我不能保证我的解决方案有多符合Python的风格,但我终于把不同的应用程序一起运行起来了。我之前在使用命名空间包的方向上是对的,但我没有试图把所有东西放在一个超级项目里,而是在每个单独项目的setup.py文件中添加了namespace_packages
这一行。这样做后,当这些项目一起安装时,它们就能正常工作,像我想的那样共享company_name
这个命名空间。
如果有人想讨论一下这是否是一个合理的Python解决方案,我还是很想听听大家的看法,看看这是不是“正确的做法”。我觉得这样做是对的,但可能是因为它跟我更熟悉的Java风格有点像。