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

Rob*_*ith 5 python packaging setuptools

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

setup.py

from setuptools import setup, find_packages
setup(
...
    include_package_data = True,
...
)
Run Code Online (Sandbox Code Playgroud)

这是MANIFEST.in

MANIFEST.in

recursive-include <my-project>/static *
global-exclude *.pyc
global-exclude .git
Run Code Online (Sandbox Code Playgroud)

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

谢谢

fja*_*rri 16

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

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

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

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

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

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

有两种可能的方法:

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

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

编辑:回答其他问题:

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

我没有使用过这个特殊的选项(也许我应该),但我在另一个项目中也有类似的设置,它也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()通常会被选中.