在我看来,而不是过多的命名关键字参数
distutils.core.setup
函数,可以在同一目录中使用setup.cfg
文件
作为setup.py
文件,所有这些关键字都将从setup.cfg文件中读取。
我以为我可以用Python 2.7简单地创建一个setup.cfg
,但这是一个最小的测试
版本只是不起作用。我用setup.py --name
测试了它
只返回:UNKNOWN
。
像往常一样使用python-packaging,文档很混乱, 因为它永远不清楚,它们与哪个版本有关,或者至少有多久 文档是。
我的两个设置文件:
setup.py:
from distutils.core import setup
setup()
setup.cfg:
[metadata]
name = foo
version = 0.1
我查看了distutils包,发现(除了像地狱一样难看)
似乎use the mail.message_from_file
工厂要阅读setup.cfg
。
由于我对setup.py
的态度非常好 - 只有这种做法我不会再费心了
有这样的废话,但我仍然很好奇如何做到这一点,如果有可能的话。
official packaging doc和Packaging-Authority似乎都不是一个很大的帮助。
几乎每次我都不得不深入研究python的2.x stdlib我想知道他们是否 试着展示如何不编程。另一方面,C-Code看起来很漂亮。
答案 0 :(得分:34)
请注意,截至2016年12月和setuptools版本30.3.0,可以按照idle sign's answer将包元数据放入setup.cfg。
问题是 setup.cfg 文件无法执行您想要的操作。它不为setup
函数提供参数。它用于为 setup.py 提供的命令提供参数。您可以使用 setup.py --help-commands 列出支持的命令。你应该看到类似的东西:
(env) gondolin/zender% ./setup.py --help-commands
Standard commands:
build build everything needed to install
build_py "build" pure Python modules (copy to build directory)
.....
install_data install data files
sdist create a source distribution (tarball, zip file, etc.)
这是您可以放在 setup.cfg 文件中的部分列表。您可以使用 setup.py --help 命令 列出命令支持的选项。例如, sdist 命令支持以下选项:
(env) gondolin/zender% ./setup.py --help sdist
Common commands: (see '--help-commands' for more)
....
Options for 'sdist' command:
--formats formats for source distribution (comma-separated list)
--keep-temp (-k) keep the distribution tree around after creating archive
file(s)
--dist-dir (-d) directory to put the source distribution archive(s) in
[default: dist]
--help-formats list available distribution formats
您可以通过添加 setup.cfg 文件来控制用户在项目中运行 ./ setup.py sdist 时会发生什么。
[sdist]
keep-temp = 1
dist-dir = dist/source
所以...... setup.cfg 只是简单地为您的项目配置各种设置命令的行为。 setup
函数确实需要将元数据作为关键字参数提供给它。您可以编写自己的distutils.dist.Distribution
类版本,该类从 setup.cfg 中提取元数据,并将其作为distclass=
关键字参数提供给setup
。
这个难题的缺失部分是标准Distribution
类没有提供将path
参数传递给distutils.dist.DistributionMetadata
初始化程序的方法,该初始化程序可以完成您想要的任务 - 它使用您提到的电子邮件解析内容读取包信息。您找到的是用于处理PEP-314 / PEP-345元数据文件的代码。 setup
函数不使用它。相反,它用于解析嵌入在分布式包中的元数据。
答案 1 :(得分:21)
我很高兴自setuptools 30.3.0(2016年12月8日)声明配置 setup.cfg is available。
答案 2 :(得分:5)
免责声明:对于带有 stdlib distutils
软件包的 python 2.7 ,以下评论均属实。对于其他版本,它们可能误导或错误。
独立于D. Shawleys非常精心和复杂answer我得出了相同的结论,并决定为陈述性元词做trivial solution。
因此,为了每个人,他们遇到同样的问题并且不想在这些无关紧要的事情上花费太多时间,这是setup.cfg
问题的简短摘要:
setup()
使用setup.cfg
不允许以一般方式为所有提供的命令声明名称,版本,许可证和类似的元数据setup()
的关键字参数来定义这些元数据setup.cfg
的所有部分均以命令命名,并更改setup()
函数see D.Shawleys answer的行为因此,考虑到这些发现,我实施了Q&D™解决方案,该解决方案允许setup.cfg
- 部分如下:
[metadata]
name = foo
version = 0.1
和一个带有:
的setup.pydistutils.core.setup(**metadata_from_setupcfg())
基本上我将distutils2-solution作为方向,并且通过setup.py
使用execfile
脚本中的额外路径麻烦避免了进行额外导入的需要。
感兴趣的人有exemplary gist。