2017-05-29 54 views
2

我想用setuptools寫一個setup.py文件。我的軟件包取決於tensorflow,但有兩種不同的pip軟件包可滿足要求:tensorflowtensorflow-gpu。如果我只將tensorflow放入我的setup(..., install_requires=["tensorflow"]),那麼如果用戶在其系統上安裝了tensorflow-gpu pip軟件包,安裝將會失敗。如何通過pip包名指定setuptools的兩個備選需求?

imp的模塊不能被用於檢查(如在此答案:How to check if a python module exists without importing it),因爲模塊的進口名稱爲tensorflow無論用戶安裝的PIP包的。那麼setuptools(以及distutils)如何檢測安裝了哪個pip軟件包?我已經通過源頭挖掘了一下,但找不到它檢查的地方。

*請注意,我不打算在黑客中使用setuptools來接受。我只想知道它使用什麼方法來檢測包,因此我可以在我的setup.py中使用相同的方法手動將install_requires參數設置爲正確的版本。 (即像這樣:Alternative dependencies (fall back) in setup.py

回答

2

answered最近有一個類似的問題。你需要區分一個TF和另一個。我不知道TF足夠幫助細節,但大部分的代碼應該是這樣的:

kw = {} 
try: 
    import tensorflow 
except ImportError: # There is no one, declare dependency 
    kw['install_requires'] = ['tensorflow'] 
else: 
    if is_gpu(tensorflow): 
     kw['install_requires'] = ['tensorflow-gpu'] 
    else: 
     kw['install_requires'] = ['tensorflow'] 

setup(
    … 
    **kw 
) 
+0

是的,最後我做了這樣的事情......但這不可能是方法setuptools正在使用,因爲它是模塊特定的。它以某種方式檢查點數據庫嗎? –

+0

沒有'點子數據庫'。我認爲setuptools和Co掃描站點包中的* .dist-info目錄。 – phd

+0

應該指出的是,這個很好的答案不能縮放到輪子,這些輪子不能執行這種安裝時邏輯。你能做什麼,呃? 'setuptools'。 'setuptools'永遠不會改變。 –