在使用setuptools构建包时,我应该包含测试和.pyc文件吗?

时间:2015-09-04 05:30:03

标签: python packaging 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和其他客户端测试的测试,这些测试包含在静态文件中。在这种情况下,推荐的测试方法是什么?

由于

1 个答案:

答案 0 :(得分:16)

讨论越来越长,所以我在这里写下自己的想法。

  

一切看起来还不错,但是当我运行此命令时,默认包含.pyc文件(我猜测这是由于构建过程)。

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

  

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

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

  

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

有两种可能的方法:

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

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

  3. 编辑:回答其他问题:

      

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

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

    一般来说,如果你能做到这一点,那就做好事(特别是持续整合)。

      

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

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

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

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

      

    “Python包装用户指南”包含一个示例:package = find_packages(exclude = [&#39; docs&#39;,&#39; tests *&#39;])

    这样做是为了包含所有用于安装的Python包,但是跳过包含.py文件的文件夹,这些文件不应该作为包安装。您可以这样做,也可以手动提供包列表。它只是如何从我上面的答案中实现方案1的一个示例。在方案2中,您的tests文件夹将主包文件夹中,并且find_packages()通常会被<{1}}选中。