在 setup.cfg 中正确使用 PEP 508 环境标记

Posted

技术标签:

【中文标题】在 setup.cfg 中正确使用 PEP 508 环境标记【英文标题】:Correct use of PEP 508 environment markers in setup.cfg 【发布时间】:2017-12-06 07:14:12 【问题描述】:

我正在尝试通过指定仅在特定操作系统上有意义的依赖项来利用 PEP 496 -- Environment Markers 和 PEP 508 -- Dependency specification for Python Software Packages。

我的setup.py 看起来像这样:

import setuptools
assert setuptools.__version__ >= '36.0'

setuptools.setup()

我最小的setup.cfg 看起来像这样:

[metadata]
name = foobar
version = 1.6.5+0.1.0

[options]
packages = find:

install_requires =
    ham >= 0.1.0
    eggs >= 8.1.2
    spam >= 1.2.3; platform_system=="Darwin"
    i-love-spam >= 1.2.0; platform_system="Darwin"

但是,当尝试使用 pip install -e foobar/ 安装此类软件包时,它会失败并显示:

pip._vendor.pkg_resources.RequirementParseError: Invalid requirement, parse error at "'; platfo'"

我猜它不希望有分号。但是我应该如何使用环境标记呢?

【问题讨论】:

我很惊讶你能走到这一步......我一直认为install_requiressetup() 的参数,而不是命令行标志。 @Kevin 这也不是命令行标志——它在setup.cfg 内部,这是另一个混​​乱的来源(***.com/q/44878600/472695)。老实说,我几乎讨厌 Python 的打包系统。 我已经用 Setuptools 打包并分发了一个 Python 库,不需要 setup.cfg。我认为这里的简短回答是“将所有内容移入 setup.py 并删除 setup.cfg。” @Kevin,下一步是抛弃 setuptools 并使用 distutils,因为 setuptools 太主流了。严肃地说,为什么要追溯到 9 年前的 Python 打包开始的地方——在古老的“setup.py”? packaging.python.org 有两处简短地提到了 setup.cfg,其余的是关于 setup.py。我不知道谁告诉你 setup.cfg 是新的热点,但他们错了。 【参考方案1】:

一个字符。这就是你所缺少的。你有platform_system="Darwin" 而不是platform_system=="Darwin"install_requires 的最后一行)。这样可以正常工作:

[metadata]
name = foobar
version = 1.6.5+0.1.0

[options]
packages = find:

install_requires =
    ham >= 0.1.0
    eggs >= 8.1.2
    spam >= 1.2.3; platform_system=="Darwin"
    i-love-spam >= 1.2.0; platform_system=="Darwin"

这不是必需的,但您的setup.py 也可以简化。

import setuptools

setup(setup_requires=['setuptools>=36.0'])

与之前的评论不同,我喜欢使用setup.cfg。它既干净又容易。如果你想在运行时使用来自setup.cfg的信息,很容易解析:

from setuptools.config import read_configuration

conf_dict = read_configuration('/home/user/dev/package/setup.cfg')

More setup.cfg info

【讨论】:

该死的……这么多年了。 我一直在寻找setup.cfg 信息,因为不可否认,文档不是很好,然后从谷歌偶然发现了这个。 BLTN?

以上是关于在 setup.cfg 中正确使用 PEP 508 环境标记的主要内容,如果未能解决你的问题,请参考以下文章

PEP8-python编码规范(下)

如何将 PEP 517 和 PEP 518 用于本地可用(不在 PYPI 上)系统范围的 CLI Python 脚本

openstack 使用pbr配置,setup.cfg的格式与含义

如何在不使用 setup.py 文件的情况下构建源代码分发?

Pipenv的使用

Pipenv的使用