【问题标题】:setuptools "at least one of these" dependency specificationsetuptools“至少其中一个”依赖规范
【发布时间】:2011-01-02 16:38:18
【问题描述】:

在某些情况下,有各种模块,每个模块都实现了一个公共 API(在我的例子中,旧的纯 python elementtreecElementTreelxml.etree 和内置的xml.etree)。我可以使用ElementTree 编写模块来尝试这些选项中的每一个,并根据我自己的偏好顺序选择第一个存在的选项——但我找不到任何关于指定只有其中一个必须安装的信息setup.py。我想写一些看起来像这样的东西:

setup(
    ...,
    install_requires="""
        elementtree | cElementTree | lxml
    """,
    ...
)

这或类似的东西,可能吗?

【问题讨论】:

    标签: python dependencies setuptools


    【解决方案1】:

    我不这么认为,但是,如果您使用的是相当新的 Python,elementtree 是标准 Python 库的一部分,您为什么担心它可能不存在? (我知道这对于 API 的几种可能实现的其他情况会是一个问题,我只是想知道您是否真的需要它来满足您的特定用例)。

    【讨论】:

    • 这个问题实际上发生在我们正在使用的一个开源第三方模块中,所以我一直在寻找一个解决方案来作为补丁贡献,并希望避免出现公开羞辱开发人员的模块。我们的其他代码依赖于 lxml,并在 Py26 中运行,因此我们至少有两个其他实现可用——只是不是名为 elementtree 的实现。
    【解决方案2】:

    您可能想尝试在 setup.py 中执行类似的操作:

    install_requires = ["elementree"]
    
    try:
        import cElementTree
        install_requires = []
    except ImportError:
        try:
            import lxml
            install_requires = []
        except ImportError:
            # etc for remaining equivalent modules
    
    setup(
        install_requires = install_requires,
        # rest of setup parameters
    )
    

    如果没有安装任何等效项,这将基本上安装 elementree 包作为依赖项。

    【讨论】:

    • 不幸的是,这行不通——代码是通过 RPM 部署的,每个第三方模块(请参阅我对 Alex Martelli 的帖子的评论)都在单独的 RPM 中构建和安装。当pkg_resources 在启动时检查依赖关系时,我们已经过了运行setup.py 的时间(实际上它甚至不存在于发生错误的系统上)。
    • 这对我来说没有意义。如果您将软件包部署为 RPM,为什么还要运行 setup.py?
    • setup.py 在 RPM 构建期间运行,除其他外,创建名为“elementtree”的.egg-info/requires.txt。我认为更改它的正确位置是在 setup.py 中用于具有依赖项的组件,以及在尝试导入 elementtree 的模块中。
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2015-06-12
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多