Python “设置工具”;其中至少有一个;依赖规范

Python “设置工具”;其中至少有一个;依赖规范,python,dependencies,setuptools,Python,Dependencies,Setuptools,在某些情况下,存在各种模块,每个模块都实现一个公共API(在我的例子中,是旧的纯pythonelementtree,celementree,lxml.etree,以及内置的xml.etree)。我可以使用ElementTree编写模块来尝试这些选项中的每一个,并根据我自己的偏好顺序选择存在的第一个选项——但是我找不到任何关于指定只能在setup.py中安装其中一个选项的信息。我想写一些像这样的东西: setup( ..., install_requires="""

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

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

这是可能的吗?

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

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

您可能希望尝试在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软件包作为依赖项安装。

您可能希望尝试在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软件包。

这个问题实际上发生在我们正在使用的开源第三方模块中,因此我正在寻找一个解决方案作为补丁提供,并希望避免出现公开羞辱模块开发人员的现象。我们的另一个代码依赖于lxml,并在Py26中运行,因此我们至少有两个其他可用的实现--只是没有名为
elementtree
的实现。这个问题实际上发生在我们正在使用的开源第三方模块中,所以我正在寻找一个解决方案作为补丁,并希望避免出现公开羞辱模块开发人员的现象。我们的另一个代码依赖于lxml,并在Py26中运行,因此我们至少有两个其他实现可用——只是没有名为
elementtree
的实现。不幸的是,这不起作用——代码是通过RPM部署的,每个第三方模块(请参阅我对Alex Martelli文章的评论)都是在单独的RPM中构建和安装的。当
pkg_resources
在启动时检查依赖关系时,运行
setup.py
的时间已经过去了(事实上,在发生错误的系统上它甚至不存在)。这对我来说没有意义。如果您将包部署为RPM,为什么要运行setup.py?
setup.py
在RPM构建期间运行,并创建名为“elementtree”的
.egg info/requires.txt
。我认为应该在
setup.py
中对具有依赖关系的组件以及尝试导入
elementtree
的模块进行更改。不幸的是,这不起作用——代码是通过RPM部署的,每个第三方模块(请参阅我对Alex Martelli帖子的评论)在单独的RPM中构建和安装。当
pkg_resources
在启动时检查依赖关系时,运行
setup.py
的时间已经过去了(事实上,在发生错误的系统上它甚至不存在)。这对我来说没有意义。如果您将包部署为RPM,为什么要运行setup.py?
setup.py
在RPM构建期间运行,并创建名为“elementtree”的
.egg info/requires.txt
。我认为,对于具有依赖关系的组件,以及尝试导入
elementtree
的模块,可以在
setup.py
中进行更改。