Buildout:使用系统Python的依赖项

3 投票
4 回答
979 浏览
提问于 2025-04-17 00:34

我正在尝试使用 buildout 来管理一个Python包,这个包在使用时需要依赖两个扩展模块:dbus-pythonpygobject。这两个模块让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    

……似乎没有任何效果(依然失败),尽管这两个包(dbusgobject)已经安装在我的系统Python中。当我删除 allowed-eggs.. 这一行时,情况也是一样。

我的问题:我在概念上是不是搞错了什么,还是我的 buildout.cfg 文件有错误?

我知道有一个 zc.recipe.cmmi 的配方,它使用 configure, make, make install 来安装包。不过,在我的情况下,简单引用系统Python的包就足够了。我不需要buildout生成一个100%可复现的环境。而且,dbus-pythonpygobject 在大多数Linux桌面系统上都是默认安装的,这正是 foobar 计划使用的环境。

4 个回答

2

你可能想为每个表现不好的 Python 版本使用一个 CMMI 部件,并且在你的 python 部件中使用 extra-paths 选项,以确保这些 CMMI 部件被包含在 Python 的路径中。

3

我也没能让最新的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这个方案,因为它比较可靠。

2

感谢@Rainout的回答和评论,我找到了问题的真正来源。问题不在于buildout或我的配置,而是在于DBus和Gobject的Python绑定:这些包不是以egg的形式分发的,而是以普通包的形式。

所以虽然可以通过PyPI获取这些包,但在任何期望Python包以egg形式提供的环境中,它们是无法使用的。实际上,这意味着这些包的依赖关系不能在setup.py中列出,而需要以其他方式处理(如果有的话)。

撰写回答