2

假设我有一堆需求文件,例如:

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

我想根据当前的 Python 解释器版本install_requires在文件中填充参数。setup.py当然假设pip处理安装过程。

解决方案 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论点,但没有运气。依赖项已下载,但我无法访问它,因为它是一个鸡蛋包(未提取)。

有什么办法可以克服这个问题吗?是否有任何替代方案(其他方法)可以帮助解决这个问题?

谢谢!

4

1 回答 1

0

由于您不想为多个项目复制代码,您可能会考虑setup.py从单一来源生成和/或更新 setup.py 的某些部分。这类似于MakefileMakefile.in模板生成一个。

我有一个py_setup程序。我调用它以在当前目录py_setup --new中生成一个新setup.py的,将 py_setup 的一部分作为模板。当py_setup以文件名作为参数运行时,它会尝试更新该文件中的段,但保持其余部分不变。当不带参数且不带选项运行时,py_setup会更新所有*/setup.py文件上的段。

(和 setup.py 文件)中的段py_setup由表单的注释行分隔#_## segement_name或以#_#. 复制段之前或之间的任何内容,但永远不会在 py_setup 中setup.py 的行之后的任何内容中更新,即实际代码是实际程序代码#_###py_setup

大多数行都是逐字复制的,除了段分隔符注释(在段名称之后剥离)和以以下开头的行:

setup = setup

从那行setup =开始,它就被剥离了,所以它最终在 setup.py 中调用 setup() 但在 running 时没有py_setup

更新时,只有目标中的现有setup.py被替换为 中相同命名段的行py_setup。删除或更改段名称可确保不会更新代码更改。

于 2013-03-12T16:23:57.747 回答