我正在尝试在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和其他客户端测试的测试,这些测试包含在静态文件中。在这种情况下,推荐的测试方法是什么?
由于
答案 0 :(得分:16)
讨论越来越长,所以我在这里写下自己的想法。
一切看起来还不错,但是当我运行此命令时,默认包含.pyc文件(我猜测这是由于构建过程)。
Python源代码在安装时进行了预编译,.pyc
文件与.py
文件一起放在安装位置setuptools
。这是一种正常的行为。
在MANIFEST.in中明确排除它们并没有帮助。
MANIFEST.in
管理分发,而不是安装。也就是说,它会在setuptools
运行时告诉python setup.py sdist
哪些文件包含在存档中。它通常用于包含文档,测试,许可证和其他附带文件,这些文件是程序包的一部分,但实际上并未安装。安装 的文件(除了.py
文件外)在package_data
关键字参数中指定setup()
。
另一个问题:我是否应该在已安装的软件包中包含我的测试文件夹(recursive-include / test / *)?
有两种可能的方法:
在发行版中包含测试,但不安装它们。为此,您将它们放在一个单独的文件夹中,并在.py
中明确包含所有必需的文件(包括MANIFEST.in
个文件)。作为示例,请参阅我的一个项目manifest中的摘录:
recursive-include test *.py
include test/pylintrc
include test/.coveragerc
在程序包本身中包含测试,以便您可以将其作为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
和许多其他软件包都做得很好。我看到的唯一缺点是:
总之,我没有任何反对意见,可能会很好地将这种设置用于我的下一个项目。
“Python包装用户指南”包含一个示例:package = find_packages(exclude = [&#39; docs&#39;,&#39; tests *&#39;])
这样做是为了包含所有用于安装的Python包,但是跳过包含.py
文件的文件夹,这些文件不应该作为包安装。您可以这样做,也可以手动提供包列表。它只是如何从我上面的答案中实现方案1
的一个示例。在方案2
中,您的tests
文件夹将在主包文件夹中,并且find_packages()
通常会被<{1}}选中。