2017-08-04 104 views
3

我正在查看一個開源軟件包(MoviePy),它根據安裝的軟件包調整其功能。例如,要調整圖像大小,將使用OpenCV提供的功能,否則使用PIL/pillow,否則使用SciPy。如果沒有可用的,它將優雅地回退到不支持調整大小。我可以在setup.py的tests_require中使用環境標記嗎?

setup.py函數標識tests_require參數中的一些可選依賴關係,因此可以運行測試。

但是,還有一層複雜性尚未處理。某些可選軟件包不適用於支持的所有平臺版本。 (我認爲一個例子是他們使用的OpenCV版本不適用於Windows 3.3的Python 3.3,但是如果這是錯誤的請不要掛斷電話,我正在尋找一般的解決方案。)

解決方案將出現要使用environment markers,根據哪個Python版本和哪個操作系統指定應安裝哪些版本的軟件包。我可以用requirements.txt文件來做到這一點。我想我可以用Conda來做到這一點(使用不同的格式 - 冒號而不是分號)。但我如何在setup.py中執行此操作?

我迄今的實驗都失敗了。

例如:把環境標誌的包版本後,用分號:

requires = [ 
    'decorator>=4.0.2,<5.0', 
    'imageio>=2.1.2,<3.0', 
    'tqdm>=4.11.2,<5.0', 
    'numpy', 
    ] 

optional_reqs = [ 
    "scipy>=0.19.0,<1.0; python_version!='3.3'", 
    "opencv-python>=3.0,<4.0; python_version!='2.7'", 
    "scikit-image>=0.13.0,<1.0; python_version>='3.4'", 
    "scikit-learn; python_version>='3.4'", 
    "matplotlib>=2.0.0,<3.0; python_version>='3.4'", 
    ] 

doc_reqs = [ 
    'pygame>=1.9.3,<2.0', 
    'numpydoc>=0.6.0,<1.0', 
    'sphinx_rtd_theme>=0.1.10b0,<1.0', 
    'Sphinx>=1.5.2,<2.0', 
    ] + optional_reqs 

test_reqs = [ 
    'pytest>=2.8.0,<3.0', 
    'nose', 
    'sklearn', 
    'pytest-cov', 
    'coveralls', 
    ] + optional_reqs 

extra_reqs = { 
    "optional": optional_reqs, 
    "doc": doc_reqs, 
    "test": test_reqs, 
    } 

然後在通話設置,參數是:

tests_require=test_reqs, 
install_requires=requires, 
extras_require=extra_reqs, 

當我建立這個上特拉維斯,Python 3.6.2,PIP 9.0.1:

> python setup.py install 
error in moviepy setup command: 'extras_require' requirements cannot include environment markers, in 'optional': 'scipy<1.0,>=0.19.0; python_version != "3.3"' 

我可以指定en環境標記爲tests_require in setup.py

+0

這不是我的專業領域。但是,其他人可能會善意地看到你的一些失敗的實驗。 – Prune

+0

另外,爲什麼不使用'requirements.txt'足夠? – larsks

+0

@larsks:他們服務於不同的目的。 Setup.py是您的購物清單。 Requirements.txt是您的裝箱單。 (我記得它的'安裝文件包含你的要求,而需求文件包含你的設置') – Oddthinking

回答

2

是的,你可以。將環境標記附加到每個相關元素tests_require,用分號分隔,例如:

tests_require=[ 
    'mock; python_version < "3.3"' 
] 
+1

只需確認這對我有用,但只有在從36.2.0升級setuptools之後,纔會**,而拒絕它。 – Oddthinking

相關問題