2010-01-07 23 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

相關問題