我有两个setuptools包(通过setup.py
管理,导入并调用setuptools.setup()
)。两者共享相同的基本命名空间包:foo.bar.util
和foo.bar.service
。第二个取决于第一个,并列在install_requires
中。该程序包由MANIFEST.in
项下的所有src/
个项目组成,这些项目仅移植src/
,然后以递归方式排除*.pyc
和__pycache__/**
。对于两个包,namespace_packages
都设置为['foo', 'foo.bar']
。
它按预期工作。我可以构建一个sdist,将其推送到私有PyPI,pip install
,等等。但是,当第二个包需要第一个时,我运行任何python setup.py
命令(test
,develop
,install
等),它完全是炸弹。
奇怪的是,当我在develop
失败后启动CPython解释器时,第一个包就在那里。但是,第一个程序包所依赖的任何程序包(如more-itertools
)都会导致尝试将这些程序包加载到错误状态。不知何故,代码正在被合并,但依赖关系不是。
最后,如果我打开DISTUTILS_DEBUG=1
和SETUPTOOLS_DEBUG=1
,我会看到来自私有PyPI的提取。我看到尝试打包bdist_egg
。这就是奇怪的地方:在bdist_egg
输出行之后,不再提及这个包了吗?
我一直在捣乱我的大脑并不断寻找。有没有人碰到这样的事情?
编辑:
所以,我在src/
下打包我的内容,如下所示:
http://blog.ionelmc.ro/2014/05/25/python-packaging/
查看python setup.py develop
DISTUTILS_DEBUG=1
输出,我发现graft src
中的MANIFEST.in
指令包括src/<required code>
,src/<this egg-info>
和{ {1}}。呵呵。奇怪的。然后它再次抓住所有内容src/<required egg-info>
!发生了什么事?
编辑:
好的,这是我试图为Python生态系统过于聪明。我为我的公司创建了一个鸡蛋模板。我们的目标之一是拥有一个可刷新的模板。 src/src/
属于那个 - 如果我们想要注入自定义目标,我们可以运行模板更新程序 Bash脚本,它将克隆我们所有的GitHub存储库,进行修改,并可选择提交和推他们。这包括Tox和Travis。
所以我做的是从setup.py
导入setup_cfg.py
。前者具有包名称和版本,并且被Updater忽略。第二个是样板。
问题在于setup.py
,所有python setup.py <develop|install>
最终都在同一地点(我假设)。因此,安装依赖包的行为实际上安装了包的问题。当安装包有问题的时候,它被跳过了。
向后翻转,我们有setup_cfg.py
这是样板文件,setup_template.py
实际上没有setup.py
代码,只有项目名称和版本,完美无缺!
不幸的是,Python没有env-internal软件包版本管理或清洁。 :(
现在,我仍然面临的唯一问题是,由于某种原因,这不适用于Tox。我怀疑命名空间包有些奇怪。我将去看看Zope是如何测试的,因为我知道他们使用命名空间包。