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

tor*_*gen 5 python setuptools python-3.x python-packaging

我试图通过指定仅在特定OS上有意义的依赖项来利用PEP 496-环境标记PEP 508-Python软件包的依赖项规范。

我的setup.py样子是这样的:

import setuptools
assert setuptools.__version__ >= '36.0'

setuptools.setup()
Run Code Online (Sandbox Code Playgroud)

我的最小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"
Run Code Online (Sandbox Code Playgroud)

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

pip._vendor.pkg_resources.RequirementParseError: Invalid requirement, parse error at "'; platfo'"
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*Ivy 5

一个字符。这就是你所缺少的。你有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"
Run Code Online (Sandbox Code Playgroud)

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

import setuptools

setup(setup_requires=['setuptools>=36.0'])
Run Code Online (Sandbox Code Playgroud)

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

from setuptools.config import read_configuration

conf_dict = read_configuration('/home/user/dev/package/setup.cfg')
Run Code Online (Sandbox Code Playgroud)

更多 setup.cfg 信息