2012-12-11 62 views
2

假設我有一個像一堆要求文件:解決Python的依賴關係基礎上的翻譯版本

requirements.txt # common for both 2.x and 3.x 
requirements-2.txt # 2.x 
requirements-3.txt # 3.x 

,我想根據當前填充install_requires論點setup.py文件Python解釋器版本。當然假設處理安裝過程。

解決方案1:當然,我可以編寫一個簡單的函數來讀取並返回正確的需求。在有多個項目的情況下,這顯然是不可接受的,因爲我將不得不復制到任何地方的功能。

解決方案2:這裏接下來的想法是寫一個簡單的包,它會爲我,但問題是,它應該是不僅可在分配的時間(如python setup.py sdist),但更重要的是,在安裝時在一臺機器上。

我被設法編寫一個簡單的模塊來完成這件事,我們稱它爲depmodule。我也有以下setup.py

# -*- coding: utf-8 -*- 

from setuptools import setup, find_packages 

try: 
    from depmodule import find_requirements 
except ImportError: 
    # this line is executed when reading setup.py for the first time 
    # since depmodule is not installed yet 
    find_requirements = lambda: [] 

setup(
    name='some-package', 
    packages=find_packages(), 
    # snip... 
    platforms='any', 

    # note that depmodule is listed here as a requirement, so it will be 
    # installed before some-package, thus will be available when it comes 
    # to running setup.py of some-package 
    install_requires=['depmodule'] + find_requirements(), 
) 

當談到pip install some-package實際上正確的解決依賴,但它們不是由PIP回升,所以它只能安裝:depmodule some-package(按順序),而不是depmodule dep1 dep2 ... some-package

我試圖用setup_requires的說法,但沒有運氣。下載依賴項,但我無法訪問它,因爲它是一個蛋包(未提取)。

有什麼辦法可以解決這個問題嗎?有沒有其他方法可以幫助解決這個問題?

謝謝!

回答

0

由於您不想複製多個項目的代碼,因此您可能會考慮從單一來源生成setup.py和/或更新setup.py的某些部分。 這將類似於從Makefile.in模板生成Makefile

我有一個py_setup這個程序。我用py_setup --new來調用它,在當前目錄中生成一個新的setup.py,並將py_setup的一部分作爲模板。當py_setup爲 以文件名作爲參數運行時,它會嘗試更新該文件中的段,但不改變其餘部分。 運行時沒有參數且沒有選項py_setup確實會更新所有*/setup.py文件中的段。

py_setup(和setup.py文件)中的段由表單#_## segement_name形式的註釋行分隔,或以#_#結尾。前或段之間的任何內容複製,但絕不會在py_setup行#_###setup.py 東西是永遠不會被複製得到更新,這是實際py_setup程序代碼

大部分線路都逐字複製的實際代碼,除了段分隔符的註釋(段名後剝離)和行開頭:

setup = setup 

從該行setup =在開始被剝離,所以以設置一個呼叫結束()中setup.py但運行時不能運行py_setup

更新時,只有現有段是在目標setup.py被替換爲在py_setup從相同的命名片段線。刪除或更改段名可確保代碼更改不會被取消。