python - 基于解释器版本在安装时解决 setup.py 中的 Python 依赖关系

标签 python pip dependency-management

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

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

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

解决方案 1:当然,我可以编写一个简单的函数来读取并返回正确的要求。在有多个项目的情况下,这显然是 Not Acceptable ,因为我将不得不在各处复制该函数。

解决方案 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 参数但没有成功。下载了依赖项,但我无法访问它,因为它是一个 egg 包(未解压)。

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

谢谢!

最佳答案

由于您不想为多个项目复制代码,您可以考虑从单一来源生成 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 形式的注释行分隔或以 #_ 结尾#。复制段之前或段之间的任何内容,但永远不会在 setup.py 中更新 py_setup 中 #_### 行之后的任何内容都不会被复制,这就是实际的 py_setup 程序代码

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

setup = setup

从那行开始,setup = 被剥离,所以它最终在 setup.py 中作为对 setup() 的调用结束,但在运行 py_setup 时不是。

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

关于python - 基于解释器版本在安装时解决 setup.py 中的 Python 依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13812483/

相关文章:

python - 复制 virtualenv 而无需在同一台机器上再次下载所有包

php - Symfony 如何用 Git 和 Composer 管理 Component 的子包?

linux - 升级的构建机器(Debian),构建无法在服务器(CentOS)上运行

python - 导入 Google 联系人库时出错?

python - pip已安装但无法运行

Python3.2 : Installing MySQL-python fails with error "No module named ConfigParser"

python - wxPython:sizers,网格让我发疯

Python 3.5 JSON 序列化 Decimal 对象

python - 如何从句子中删除数字和长度小于 2 的单词?

python - 使用 Django 时如何隐藏 Pylint 1.2.1 错误输出?