2017-06-14 17 views
3

這對我沒有意義。我如何使用setup.py來安裝Cython,然後使用setup.py來編譯庫代理?在一個涉及Cython的setup.py中,如果install_requires,那麼怎麼從庫中導入一些東西?

import sys, imp, os, glob 
from setuptools import setup 
from Cython.Build import cythonize # this isn't installed yet 

setup(
    name='mylib', 
    version='1.0', 
    package_dir={'mylib': 'mylib', 'mylib.tests': 'tests'}, 
    packages=['mylib', 'mylib.tests'], 
    ext_modules = cythonize("mylib_proxy.pyx"), #how can we call cythonize here? 
    install_requires=['cython'], 
    test_suite='tests', 
) 

後來: 蟒蛇的setup.py建立

Traceback (most recent call last): 
    File "setup.py", line 3, in <module> 
    from Cython.Build import cythonize 
ImportError: No module named Cython.Build 

這是因爲用Cython尚未安裝。

奇怪的是,很多項目都是這樣寫的。快速github搜索顯示:https://github.com/search?utf8=%E2%9C%93&q=install_requires+cython&type=Code

回答

-1

它通常沒有意義。正如您懷疑的那樣,嘗試使用(可能)尚未安裝的東西。如果在已安裝依賴項的系統上進行測試,您可能不會注意到這個缺陷。但是在你的依賴不存在的系統上運行它,你一定會注意到。

還有另一個setup()關鍵字參數,setup_requires,它可以看起來在形式上是平行的並且用於install_requires,但這是一種幻覺。而install_requires在缺乏命名依賴的環境中觸發了一個可愛的自動安裝芭蕾,setup_requires比自動化更具有文檔性。它不會自動安裝,並且不會自動跳回到import語句中自動安裝已被調用的模塊。

有更多關於這在the setuptools docs,但快速的答案是,你說得對,以通過試圖模塊混淆自動安裝自己設置先決條件。

要獲得實用的解決方法,請嘗試單獨安裝cython,然後運行此設置。雖然它不能解決這個設置腳本的形而上學幻想,但它將解決這些需求並讓你繼續前進。

+0

奇怪的是,很多項目使用的代碼,因爲我寫了它。在GitHub上快速搜索可以發現它們中的大部分。沒有人在全新安裝上測試過他們的代碼? https://github.com/search?utf8=%E2%9C%93&q=install_requires+cython&type=Code – 010110110101

+0

這樣做並不是非常方便。大型支持包(例如'cython','lxml','pandas')通常會成爲陰險的期望。許多在Travis CI上進行測試,或者在本地使用虛擬環境'tox'等進行測試。但是這些構建環境會得到*自定義安裝程序*,這些程序不是從頭開始手動運行安裝程序。輕鬆運行測試很容易 - 自動構建十幾個不同的Python版本,覆蓋率達到100% - 不能單獨從'setup.py'單獨正確安裝。去過也做過。尷尬,煩人,而且非常容易。 –

2

解決這個問題的一個辦法是不要讓Cython成爲構建需求,而是將Cython生成的C文件分發到您的包中。我確定某處有一個更簡單的示例,但這是pandas所做的 - 它有條件地導入Cython,如果不存在,可以從c文件構建。

https://github.com/pandas-dev/pandas/blob/3ff845b4e81d4dde403c29908f5a9bbfe4a87788/setup.py#L433

編輯:從@danny的文檔鏈接有一個更容易理解的例子。 http://docs.cython.org/en/latest/src/reference/compilation.html#distributing-cython-modules

+1

這是最好的答案,也是Cython文檔推薦的內容(http://docs.cython.org/en/latest/src/reference/compilation.html#distributing-cython-modules)。通常,pyx文件不需要在安裝時重新評估,只要它們的源代碼發生變化。因此對於可分發軟件包,只有Cython生成的C/C++文件需要由setup.py分發和構建。 – danny

相關問題