Buildout:使用系统Python的依赖项
我正在尝试使用 buildout 来管理一个Python包,这个包在使用时需要依赖两个扩展模块:dbus-python 和 pygobject。这两个模块让buildout无法正常工作:dbus-python 没有 setup.py
文件,而 pygobject
有一个,但不推荐使用——应该用 configure, make, make install 来安装。因此,buildout无法在开发环境中设置这些依赖。
这是我的 buildout.cfg
文件:
[buildout]
develop = .
parts = eggs
[python]
recipe = zc.recipe.eggs
interpreter = python
eggs = foobar
其中 foobar
包的 setup.py
文件包含:
install_requires=['dbus-python', 'pygobject'],
在寻找解决方案时,我发现了一个叫 z3c.recipe.scripts
的配方,它有一个 可以使用系统范围内安装的包 的功能。然而,当我把它应用到我的 buildout.cfg
时……
[python]
recipe = z3c.recipe.scripts
include-site-packages = true
allowed-eggs-from-site-packages = pygobject, dbus-python
interpreter = python
eggs = foobar
……似乎没有任何效果(依然失败),尽管这两个包(dbus 和 gobject)已经安装在我的系统Python中。当我删除 allowed-eggs..
这一行时,情况也是一样。
我的问题:我在概念上是不是搞错了什么,还是我的 buildout.cfg
文件有错误?
我知道有一个 zc.recipe.cmmi
的配方,它使用 configure, make, make install 来安装包。不过,在我的情况下,简单引用系统Python的包就足够了。我不需要buildout生成一个100%可复现的环境。而且,dbus-python 和 pygobject 在大多数Linux桌面系统上都是默认安装的,这正是 foobar
计划使用的环境。
4 个回答
你可能想为每个表现不好的 Python 版本使用一个 CMMI 部件,并且在你的 python
部件中使用 extra-paths
选项,以确保这些 CMMI 部件被包含在 Python 的路径中。
我也没能让最新的1.5.x版本和系统包一起正常工作。有一种方法可以解决这个问题:锁定版本。这样,zc.buildout 1.5.x就能识别它。
[buildout]
...
versions = versions
[versions]
pygobject = 1.2.3
另外,我通常会使用旧版的1.4.4 buildout(你需要一个特别的bootstrap.py文件,可以在网上搜索一下)结合osc.recipe.sysegg。
[buildout]
...
parts =
...
sysegg
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
dbus-python
pygobject
我个人更倾向于使用osc.recipe.sysegg这个方案,因为它比较可靠。
感谢@Rainout的回答和评论,我找到了问题的真正来源。问题不在于buildout或我的配置,而是在于DBus和Gobject的Python绑定:这些包不是以egg的形式分发的,而是以普通包的形式。
所以虽然可以通过PyPI获取这些包,但在任何期望Python包以egg形式提供的环境中,它们是无法使用的。实际上,这意味着这些包的依赖关系不能在setup.py
中列出,而需要以其他方式处理(如果有的话)。