【问题标题】:Should I include tests and .pyc files when building package with setuptools?使用 setuptools 构建软件包时是否应该包含测试和 .pyc 文件?
【发布时间】:2015-11-30 04:16:43
【问题描述】:

我正在尝试在 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 &lt;my-project&gt;/test/ *) 在安装的包中?我有一些使用鼻子和其他客户端测试的测试,这些测试包含在静态文件中。在这种情况下处理测试的推荐方法是什么?

【问题讨论】:

  • 第一个问题我不太明白。您正在安装一个软件包并担心.pyc 文件出现在它的安装位置?正常的,.py文件在安装时会被setuptools自动预编译。
  • 这就是我的想法,但后来我看到了一些坚持忽略 .pyc 文件的存储库。
  • 你能链接一个例子吗?我认为默认安装的唯一东西是传递给setup()packages关键字的包中的.py文件。此外,MANIFEST 与安装无关,它控制分发(运行python setup.py sdist 时存档中包含哪些文件)。
  • 当然。来自 Google 的第一个示例:github.com/mitsuhiko/flask/blob/master/MANIFEST.in
  • 我认为在这种情况下作者包含了docs 中的everything,然后排除了.pyc.pyo 文件。您不需要对包本身执行此操作。例如。 my project 我只包含.rst 文件和来自docs 的一个.py 文件,工作得很好。

标签: python packaging setuptools


【解决方案1】:

讨论的时间越来越长,所以我就在这里写下我的想法。

一切看起来都很好,除了当我运行这个命令时,默认包含 .pyc 文件(我猜这是由于构建过程造成的)。

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

在 MANIFEST.in 中明确排除它们没有帮助。

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

另一个问题:我应该在安装的包中包含我的测试文件夹(recursive-include /test/ *)吗?

有两种可能的方法:

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

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

编辑:回答附加问题:

test_suite 选项怎么样(例如nose.readthedocs.org/en/latest/setuptools_integration.html)?

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

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

将测试作为子包包含会导致问题吗?

嗯,numpy 和许多其他软件包都做得很好。我看到的唯一缺点是:

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

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

Python 打包用户指南包含一个执行此操作的示例:packages=find_packages(exclude=['docs', 'tests*'])

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

【讨论】:

  • 非常感谢。选项test_suite(例如nose.readthedocs.org/en/latest/setuptools_integration.html)呢?将测试作为子包包含会导致问题吗? Python 打包用户指南包含一个执行此操作的示例:packages=find_packages(exclude=['docs', 'tests*'])
  • 将我的 cmets 添加到主要答案中。
  • test_suite 已弃用
  • “安装的大小增加了(但在我们的 TB 级硬盘时代,它可能并不那么重要)”:AWS lambda 的部署包大小限制为 50 MB。就在几年前,它还是~10MB。使用 Pandas / Matplotlib,您可以很快到达那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多