2010-01-07 32 views
2

在一些情况下,存在各实现一个共同的API的各种模块(在我的情况下,旧纯Python elementtreecElementTreelxml.etree,和内置xml.etree) 。我可以使用ElementTree编写模块来尝试这些选项中的每一个,并根据我自己的首选顺序采用第一个选项 - 但我找不到指定仅在setup.py中只安装其中一个的任何信息。我想写一些看起来像这样的东西:setuptools的依赖性规范“这些中的至少一个”

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

这是,或者类似的东西吗?

回答

0

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

+0

这个问题实际上发生在我们正在使用的开源第三方模块中,所以我一直在寻找一个解决方案作为补丁贡献,并且希望避免公开羞辱模块开发者的表象。我们的其他代码依赖于lxml,并且在Py26中运行,所以我们至少有两个可用的实现 - 不是名为'elementtree'的实现。 – dcrosta 2010-01-08 01:46:38

0

你可能想尝试在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包的依赖。

+0

不幸的是,这不起作用 - 代码通过RPM部署,每个第三方模块(请参阅我对Alex Martelli的文章的评论)都是在单独的RPM中构建和安装的。当'pkg_resources'正在检查启动时的依赖关系时,我们已经过去了'setup.py'运行的时候(事实上它甚至不存在于发生错误的系统上)。 – dcrosta 2010-01-08 01:47:55

+0

这对我没有意义。如果您将软件包部署为RPM,为什么要运行setup.py? – 2010-01-08 19:14:18

+0

'setup.py'在RPM构建期间运行,并且除其他外创建名为“elementtree”的'.egg-info/requires.txt'。我认为改变这个的正确位置是在'setup.py'中,以及具有依赖性的组件以及试图导入'elementtree'的模块。 – dcrosta 2010-01-08 22:52:32