2012-12-11 61 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从相同的命名片段线。删除或更改段名可确保代码更改不会被取消。