使用 setuptools 构建包时是否应该包含测试和 .pyc 文件?

Should I include tests and .pyc files when building package with setuptools?

我正在尝试在 conda 环境中使用 pip install . 安装本地包。一切看起来都很好,除了当我 运行 这个命令时,默认情况下包含 .pyc 文件(我猜这是由于构建过程)。在 MANIFEST.in 中明确排除它们无济于事。首先,这是一个问题吗? setup.py 其实很简单。主要是,唯一相关的是 include_package_data = True 我需要它来包含一些静态文件。

setup.py

from setuptools import setup, find_packages
setup(
...
    include_package_data = True,
...
)

这是 MANIFEST.in

MANIFEST.in

recursive-include <my-project>/static *
global-exclude *.pyc
global-exclude .git

另一个问题:我是否应该包含我的测试文件夹 (recursive-include <my-project>/test/ *) 在已安装的包中?我有一些测试使用 nose 和其他客户端测试,这些测试作为静态文件包含在内。在这种情况下,推荐的处理测试的方法是什么?

讨论越来越长,我就把我的想法写在这里吧。

Everything looks okay, except that when I run this command, there are .pyc files being included by default (I'm guessing this is due to the build process).

Python 源在安装时预编译,.pyc 文件与 .py 文件一起放在安装位置 setuptools。这是正常行为。

Explicitly excluding them in MANIFEST.in doesn't help.

MANIFEST.in 管理分发,而不是安装。也就是说,当 python setup.py sdist 为 运行 时,它告诉 setuptools 哪些文件要包含在存档中。它通常用于包含文档、测试、许可证和其他随附的文件,这些文件是包的一部分,但实际上并未安装。 安装的文件(除 .py 文件外)在 setup()package_data 关键字参数中指定。

Another question: Should I include my test folder (recursive-include /test/ *) in the installed package?

有两种可能的方法:

  1. 发行版 中包含测试,但不安装它们。为此,您将它们放在一个单独的文件夹中,并在 MANIFEST.in 中明确包含所有必需的文件(包括 .py 的文件)。例如,请参阅我的一个项目 manifest 中的摘录:

    recursive-include test *.py
    include test/pylintrc
    include test/.coveragerc
    
  2. 在包本身中包含测试,这样您就可以 运行 它们就像 import package; package.test()(例如,numpy 就是这样做的)。无需修改 MANIFEST.in,只需将它们放在主包目录中(作为子包或其他)并将它们视为常规 subpackage/module.

编辑: 回答附加问题:

What about the option test_suite (e.g. nose.readthedocs.org/en/latest/setuptools_integration.html)?

我没有使用这个特定选项(也许我应该),但我在 another project 中有一个类似的设置,这也使得 python setup.py test 可用 — 被 Travis.CI 用于自动测试 运行s。由于我是 py.test 的粉丝,它需要一些接口;对于 nose 它看起来更简单。

总的来说,如果你能做到,那就去做,这是一件好事(特别是对于持续集成)。

Does including tests as a subpackage cause issues?

好吧,numpy 和许多其他软件包运行良好。我看到的唯一缺点是:

  • 安装的大小增加了(但在我们的 TB HDD 时代,它可能并不那么重要)
  • 从命令行 运行 测试有点难
  • 你没有明确区分包本身和测试(很有争议)

总之,我没有任何反对意见,很可能会在我的下一个项目中使用这种设置。

The Python Packaging User Guide includes an example that does this: packages=find_packages(exclude=['docs', 'tests*'])

这样做是为了包括所有 Python 个安装包,但跳过包含 .py 个不应作为包安装的文件的文件夹。您可以这样做,也可以手动提供包列表。这只是我上面的回答中如何实现场景 1 的一个例子。在 2 场景中,您的 tests 文件夹将位于 内部 您的主包文件夹中,并且通常会被 find_packages() 拾取。