3

我正在尝试将buildout用于 Python 包,该包在使用时依赖于 2 个扩展模块:dbus-pythonpygobject。两个模块都使构建失败: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

包裹setup.py在哪里包含:foobar

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?

我知道有一个使用configure、make、make installzc.recipe.cmmi安装鸡蛋的配方。但是,在我的情况下,简单地引用系统 Python 鸡蛋就足够了。我不需要由 buildout 生成的 100% 可重现的环境。此外,dbus-pythonpygobject默认安装在大多数 Linux 桌面系统上,即打算使用的环境。foobar

4

4 回答 4

3

我也没有得到最新的 1.5.x 构建来使用系统包。有一种方法:固定版本。这样,zc.buildout 1.5.x 就会选择它。

[buildout]
...
versions = versions

[versions]
pygobject = 1.2.3

或者,我所做的,你可以使用旧的 1.4.4 构建(你需要一个特殊的 bootstrap.py,谷歌它)结合osc.recipe.sysegg

[buildout]
...
parts = 
    ...
    sysegg

[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true 
eggs =
    dbus-python
    pygobject

我个人会选择 osc.recipe.sysegg 解决方案,因为它是可靠的。

于 2011-08-29T20:49:18.910 回答
2

您可能希望为每个表现不佳的 python 发行版使用 CMMI 部分,并使用extra-paths您的部分的选项python来确保 CMMI 部分包含在 python 路径中。

于 2011-08-29T20:56:21.300 回答
2

感谢@Rainout 的回答和评论,我找到了问题的实际根源。问题不在于构建或我的配置,而在于 DBus 和 Gobject 的 Python 绑定:这些包不是作为鸡蛋分发的,而是作为普通包分发的。

因此,虽然可以通过 PyPI 检索这些包,但它们不能用于任何期望 Python 包作为egg运输的基础设施。在实践中,这意味着对这些包的依赖项不得列出,setup.py但需要以其他方式处理(如果有的话)。

于 2011-08-30T14:59:40.877 回答
0

我发现做到这一点的最佳方法是将 include-site-packages 设置为 true,然后使用mockedeggs 配方来欺骗 setuptools 认为鸡蛋在安装期间可用。唯一的缺点是您无法控制站点包中使用的内容。您可以将 allowed-eggs-from-site-packages 设置为空白以停止使用鸡蛋,但所有软件包都可用。无论如何,这是我的构建中的一个片段:

[buildout]
parts =
    mockedeggs
    myapp

include-site-packages = true
allowed-eggs-from-site-packages =

[myapp]
recipe = z3c.recipe.scripts
eggs = ${buildout:eggs}

[mockedeggs]
recipe = collective.recipe.mockedeggs
mocked-eggs =
    mapnik2 = 2.0
于 2012-08-24T02:36:07.227 回答