如何判断 setup() 是否正在读取 setup.cfg?

How to tell whether setup() is reading the setup.cfg?

我得到了一个使用 pyscaffold 生成的 Python 项目,我在根 setup.pysetup.cfg 看到了两个标准的主项目文件。我修改了 setup.cfg 文件,在元数据部分下添加了一行 version=1.0.0.

但是,运行 python setup.py developpython setup.py sdist 我在输出中看到工件名称没有我在 setup.cfg 中指定的版本。我看到以下内容:

Installed c:\users\SkyWalker\code\my_project\src
Processing dependencies for my_project==0.0.post0.dev1+g8386a10.dirty
Finished processing dependencies for my_project==0.0.post0.dev1+g8386a10.dirty

分发工件有这个 0.0.post0.dev1+g8386a10.dirty 版本,我不知道它是从哪里得到的。如何判断 python.cfg 是否被读取?

生成的 pyscaffold setup.py 如下所示:

# -*- coding: utf-8 -*-
"""
    Setup file for aqm_database_api.
    Use setup.cfg to configure your project.

    This file was generated with PyScaffold 3.2.3.
    PyScaffold helps you to put up the scaffold of your new Python project.
    Learn more under: https://pyscaffold.org/
"""
import sys

from pkg_resources import VersionConflict, require
from setuptools import setup

try:
    require('setuptools>=37.0')
except VersionConflict:
    print("Error: version of setuptools is too old (<37.0)!")
    sys.exit(1)


if __name__ == "__main__":
    setup(use_pyscaffold=True)

所以它没有显式加载 setup.cfg,而且 require('setuptools>=37.0') 行每次都失败,无论版本值是多少。

PyScaffold 配置 setuptools 使用 setuptools_scm 给出的版本。 这意味着,为了更改项目的版本,您需要 use git to tag your project. This is briefly described in https://pyscaffold.org/en/v3.3.x/features.html#versioning-and-git-integration.

我想这就是为什么更改 setup.cfg 不会更改创建的分发版本的原因。先验 setuptools should always read setup.cfg.

要确保 setuptools 正在阅读 setup.cfg,您可以做一个实验:

  1. 确保删除项目根目录或 src 文件夹内的任何 *.egg-info 文件夹(以确保您看不到缓存版本)。
  2. setup.cfg 文件中像作者一样更改一些简单的东西
  3. 像往常一样构建您的包(例如python setup.py bdist_wheel
  4. 寻找在项目根目录或 src 目录中生成的新 <your-project>.egg-info 文件夹。阅读那里的 PKG-INFO。您应该能够看到您的更改,这证明 setuptools 正在读取 setup.cfg(否则最好的选择应该是用 setuptools 打开 ticket/issue)