如何使用" setup.cfg"而不是使用Python 2.7的setup.py

时间:2014-11-22 12:25:33

标签: python python-2.7 installation

在我看来,而不是过多的命名关键字参数 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 docPackaging-Authority似乎都不是一个很大的帮助。


几乎每次我都不得不深入研究python的2.x stdlib我想知道他们是否 试着展示如何不编程。另一方面,C-Code看起来很漂亮。

3 个答案:

答案 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

Documentation

答案 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的行为
  • 您可以单独为每个命令以非常冗余的方式定义元数据
  • 您可以自由使用自定义部分名称来执行自定义命令。您可以使用这种可能性来实现自己的解决方案like i did

因此,考虑到这些发现,我实施了Q&D™解决方案,该解决方案允许setup.cfg - 部分如下:

[metadata]
name = foo
version = 0.1

和一个带有:

的setup.py
distutils.core.setup(**metadata_from_setupcfg())

基本上我将distutils2-solution作为方向,并且通过setup.py使用execfile脚本中的额外路径麻烦避免了进行额外导入的需要。

感兴趣的人有exemplary gist