当您有一个setup.py
文件时,您可以通过以下命令获取包的名称:
C:somedir>python setup.py --name
这将把包的名称打印到命令行中。
为了遵守最佳实践,我试图通过将所有内容都放在setup.cfg
中来迁移setup.py
,因为以前在setup.py
中的所有内容都是静态内容。
但我们的构建管道取决于是否能够调用python setup.py --name
。我希望以这样一种方式重写管道,即不需要创建setup.py
文件。
当您有setup.cfg
文件而没有setup.py
文件时,有没有办法获得包的名称
TL;DR,使用setuptools配置APIhttps://setuptools.pypa.io/en/latest/setuptools.html#configuration-api。
在您的情况下,这一行将给出包裹的名称:
python -c 'from setuptools.config import read_configuration as c; print(c("setup.cfg")["metadata"]["name"])'
编辑:
在setuptools v61.0.0(2022年3月24日(中,setuptools.config.read_configuration
已被弃用。使用新的API,命令变为:
python -c 'from setuptools.config.setupcfg import read_configuration as c; print(c("setup.cfg")["metadata"]["name"])'
解释:
Setuptools公开了一个read_configuration()
函数,用于解析配置的元数据和选项部分。在内部,setuptools使用configparser
模块来解析配置文件setup.cfg
。对于简单的CCD_ 13型数据;name";键,则可以使用configparser读取数据。但是,setuptools也允许使用无法直接使用configparser解析的指令进行动态配置。
以下是一个示例,显示了两种替换python setup.py --version
的方法之间的差异:
$ tree .
.
├── my_package
│ └── __init__.py
├── pyproject.toml
└── setup.cfg
1 directory, 3 files
$ cat setup.cfg
[metadata]
name = my_package
version = attr:my_package.__version__
[options]
packages = find:
$ cat my_package/__init__.py
__version__ = "1.0.0"
$ cat pyproject.toml
$ python -c 'from setuptools.config import read_configuration as c; print(c("setup.cfg")["metadata"]["version"])'
1.0.0
$ python -c 'from configparser import ConfigParser; c = ConfigParser(); c.read("setup.cfg"); print(c["metadata"]["version"])'
attr:my_package.__version__
也许使用ConfigParser Python模块?
python -c "from configparser import ConfigParser; cf = ConfigParser(); cf.read('setup.cfg'); print(cf['metadata']['name'])"
对于"过度杀伤";该解决方案允许在build
项目的帮助下,从任何PEP517兼容项目(即pyproject.toml
(中获取任何元数据字段:
#!/usr/bin/env python3
import argparse
import pathlib
import build.util
def _main():
args_parser = argparse.ArgumentParser()
args_parser.add_argument('path')
args = args_parser.parse_args()
path_name = getattr(args, 'path')
path = pathlib.Path(path_name)
#
metadata = build.util.project_wheel_metadata(path)
print(metadata)
if __name__ == '__main__':
_main()
这实际上会调用构建后端(setuptools,poetry、flit和pdm或watever(,因此这可能需要几秒钟的时间。
这里记载了CCD_ 17 API(在">最新"上(;0.7.0(16-09-2021(";,在这一变化中。
但是的,现实地说,正如你已经说过的,我建议保持最小的setup.py
:
#!/usr/bin/env python3
import setuptools
setuptools.setup()
使得CCD_ 19保持工作
当然,正如其他人已经说过的那样,解析是一个可行且简单的解决方案setuptools使用标准库中的ConfigParser
来读取setup.cfg
文件,因此您也可以这样做。
另一种可能的解决方案(归功于wim(:
python -c 'import setuptools; setuptools.setup()' --name