首页 > 解决方案 > 从文件加载的版本不符合 PEP 440

问题描述

正如标题所述,当我python -m build使用版本文件在本地运行时出现此错误。我已阅读PEP 440,对我来说,它似乎是合规的。我无法从setuptools 的文档中看到为什么我会遇到这个问题

我真的很感激这方面的一些帮助,因为我看不到我如何能够运行调试器,python -m build或者更具体地了解为什么_parse_versionofsetuptools/config.py对我的版本文件不满意。

更多细节:

我有一个项目结构如下:

src/
   mypackage/
      __init__.py
      VERSION
pyproject.toml
setup.cfg
setup.py

版本

0.0.1

设置.cfg

name = mypackage
version = file: src/mypackage/VERSION
# etc. etc. etc.

安装程序.py

#!/usr/bin/env python
# Used to create editable installs
import setuptools

setuptools.setup()

pyproject.toml

[build-system]
# Minimum requirements for the build system to execute.
requires = [
    "setuptools>=42",
    "wheel"]  # PEP 508 specifications.
build-backend = "setuptools.build_meta"

有关错误的更多详细信息:

  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/build_meta.py", line 154, in get_requires_for_build_wheel
    return self._get_build_requires(
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/build_meta.py", line 135, in _get_build_requires
    self.run_setup()
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/build_meta.py", line 150, in run_setup
    exec(compile(code, __file__, 'exec'), locals())
  File "setup.py", line 5, in <module>
    setuptools.setup()
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/__init__.py", line 153, in setup
    return distutils.core.setup(**attrs)
  File "/usr/lib/python3.8/distutils/core.py", line 121, in setup
    dist.parse_config_files()
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/_virtualenv.py", line 21, in parse_config_files
    result = old_parse_config_files(self, *args, **kwargs)
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/dist.py", line 778, in parse_config_files
    parse_configuration(self, self.command_options,
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 157, in parse_configuration
    meta.parse()
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 463, in parse
    section_parser_method(section_options)
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 436, in parse_section
    self[name] = value
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 220, in __setitem__
    value = parser(value)
  File "/tmp/build-env-2kboopyp/lib/python3.8/site-packages/setuptools/config.py", line 553, in _parse_version
    raise DistutilsOptionError(tmpl.format(**locals()))
distutils.errors.DistutilsOptionError: Version loaded from file: src/mypackage/VERSION does not comply with PEP 440: 

ERROR Backend subproccess exited when trying to invoke get_requires_for_build_wheel

标签: python-3.xsetuptools

解决方案


尽管我对当前的文档或错误消息不满意,但我已经解决了这个问题,就目前而言,我觉得很容易陷入这个陷阱。

所以解决方案是MANIFEST.in使用以下行创建一个文件: include src/mypackage/VERSION在我的仓库的顶层:

src/
   mypackage/
      __init__.py
      VERSION
pyproject.toml
setup.cfg
setup.py
MANIFEST.in

此外,必须将以下内容添加到setup.cfg

[options]
include_package_data = True

来自文档

include_package_data如果设置为 True,这将告诉 setuptools 自动包含它在 MANIFEST.in 文件指定的包目录中找到的任何数据文件。有关详细信息,请参阅包含数据文件的部分。

setuptools文档V57.1.0 让我相信它会被包括在内:

在源代码分发中自动包含所有相关文件,无需创建 MANIFEST.in 文件,也无需在源代码树更改时强制重新生成 MANIFEST 文件。

直觉上我会认为file:带有路径的关键字就足够了,或者由于没有这样的文件而产生的错误消息可能会更多地提示我。这在包装项目中也不明显

但我想它可以从MANIFEST.in 文档中推断出来。

我之所以这么说,是因为如果有人有任何有用的东西可以补充或反驳我目前的感受:当前指南中可能遗漏了有关使用版本文件的内容。


推荐阅读