2014-04-14 66 views
6

假設我想安裝pyodbc。它不能在某些Windows機器上構建,但有一種替代方案 - pypyodbc,這是純粹的Python執行pyobdcsetup.py中的替代依賴關係(回退)

有沒有辦法指定install_requires=["pyobdc"]setuptools.setup如果前一個軟件包沒有安裝,回落到pypyodbc

UPD:我對這種特定情況下的解決方案:

import sys 
from setuptools import setup 

if sys.platform.startswith("win"): 
    pyodbc = "pypyodbc>=1.2.0" 
else: 
    pyodbc = "pyodbc>=3.0.7" 

... 

setup(
     ... 
     install_requires=[pyobdc] 
    ) 

但我還是找一個更通用的解決方案。

+0

我認爲沒有錯用你的方法。根據文檔,這看起來有效。 https://pythonhosted.org/setuptools/setuptools.html#declaring-dependencies – rh0dium

回答

1

做你已經做的事似乎是一個常見的建議,但因爲這個問題是這類問題的頂級谷歌打擊,我會指出,install_requires支持一個相當複雜的迷你語言,在PEP 508

install_requires = [ 
    'pypyodbc>=1.2.0;platform_system=="Windows"', 
    'pyodbc>=3.0.7;platform_system!="Windows"' 
] 

In a comment to a related question,用戶Marius Gedminas指出,有你install_requires計算在代碼中可能有一些不利的影響,因此,上述應該是首選,以避免這個問題。

(在另一方面,https://hynek.me/articles/conditional-python-dependencies/感嘆一些相當嚴重的可移植性問題,如果您有支持的setuptools舊版本。)

+0

到目前爲止,我還沒有找到任何類似'foo ||「的語法規範或實例。在Debian軟件包中使用bar'語法來表示你想要安裝'foo'或'bar'。 – tripleee

0

對於這種情況,您的解決方案是正確的。這是目前實現這一任務的最佳和更靈活的方式。

相關問題