【发布时间】: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_requires是setup()的参数,而不是命令行标志。 -
@Kevin 这也不是命令行标志——它在
setup.cfg内部,这是另一个混乱的来源(stackoverflow.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 是新的热点,但他们错了。
标签: python python-3.x setuptools python-packaging