你推荐哪些构建工具用于Python?

38

我正在启动一个中小型的Python项目,可能使用测试驱动开发。我的背景更多是C和Java,而不是Python(我使用ant和makefile)

我知道在Python中您可能不需要构建工具,但我会用到因为我将使用Cython和PyInstaller(它应该能够在几个不同的UNIX上工作,而不直接依赖于Python),我想方便地选择CLI测试,构建文档,检查依赖项等。

有人抱怨Python缺乏类似于Make的工具。 我知道存在一些工具,如SConsPaver,但我想听听真正的用户而不仅仅是他们的网站。有人在使用Paver吗?

通常附带许多软件包的setup.py怎么样?我查看了一些,看看是否有常见用法,但我没有发现任何有趣的东西(也许我使用了错误的示例)

您是否建议继续使用我已经了解的东西(ant和Makefile)至少开始?如果是这样,您是否推荐使用任何Python(+Cython + PyInstaller + PyUnit)的ant扩展?


编辑:为避免像jwp一样的进一步回答,请注意,对于此项目,我绝对需要我的程序成为一个独立的可执行文件,因为在目标平台上运行可执行文件时不可能存在Python VM。我拥有完全相同的硬件用于编译,所以幸运的是我不需要交叉编译(但我会在更友好的Linux上进行开发)。

我也想测试一下我的代码是否可以从一开始就编译成Cython,这并不是为了过早优化,只是为了确保我没有过度使用不兼容的特性,如果真正需要Cython,这将需要痛苦的重构。

所以请专注于我的实际问题。

6个回答

15

(编辑:避免“过早”的优化建议。此答案中的工具推荐现已过时:PEP-0632。)

如果可能的话,我建议一开始避免使用扩展模块(C / cython)。先用Python编写所有代码,使用基于distutils的简单配置,在-m下运行测试(例如:python -m mypkg.test.testall或导入unittest)。

一旦您将项目达到舒适状态,然后再开始使用cython进行一些优化,并处理随之而来的额外项目管理。distutils可以构建扩展模块,因此我不确定您是否需要make / scons..


5
除非你确实需要它们并且能证明你已经采用了正确的算法但速度太慢,否则应避免使用构建工具和C语言。在你能够证明需要使用C语言之前,应该尽量避免使用它。 - S.Lott
我理解这一点,并总体上同意。但在这种特殊情况下,我绝对需要从一开始使用C。我可以避免优化(也许是Cython),但我需要程序成为一个独立的可执行文件(因此使用pyInstaller),因为在目标平台上拥有Python VM不是一个选项。我还想测试我的代码是否能够在Cython中编译,只是为了确保我没有过度使用不兼容的特性,否则当Cython真正需要时它将毫无用处。 - Davide
Cython相当不错。只需避免在代码中使用闭包,其余部分将是轻微的重构(嗯,我在cython-dev上看到有关闭包的讨论,所以这可能不再是必要的实践)。至于绝对需要使用C,你见过ctypes模块吗?或者Python扩展模块已经足够了吗?我没有使用pyInstaller,它是否与py2exe类似?我记得py2exe可以使用setuptools/distutils。Cython将使“纯Python”速度提高30%。如果这个应用程序需要性能,则很可能您会想要更多。(即,“cython lang”或C) - jwp
简而言之,除了pyInstaller之外,我不明白为什么distutils不能满足需求。在过去使用Cython时,我手动生成了.c文件,将其检入源代码管理系统,然后使用distutils构建扩展模块。但是,这是在编写和测试.py文件完成后进行的。 - jwp
3
问:我该如何做 X?答:我不明白为什么你要做 X,试试 Y 吧... -1 - Jesse Dhillon
问:我该如何做X? 答:你应该先尝试Y。如果那对你不起作用,那么再做X。 - jwp

14

您的要求更适合使用Scons,根据他们的网站,Scons比Paver具有更多对不同构建任务的控制。在后者中,您将最终使用大量的sh()运行常规命令行程序。

最近,我开始使用Paver,它非常适合用于运行测试、使用Sphinx构建文档,但我只使用纯Python。 如果您想了解Paver的可能性,我强烈推荐这两篇文章:converting-from-make-to-paverwriting-technical-documentation,作者是Doug Hellmann,您肯定想检查一下他的pavement.py配置文件(下载链接)


4
我一直使用setuptools,有时与Ant结合使用处理更复杂的任务或与其他构建集成。总的来说,这对我来说效果很好,但我听说#python(freenode)的一些人抱怨该软件包的源代码质量普遍较低,并推荐使用标准的distutils
如果你像我一样习惯于Java,那么真正需要注意的一点是Python不支持拆分包。也就是说,你不能将site.db放在src/site/db中,将site.view放在src2/site/view中,将src和src2放在PYTHONPATH上,然后期望一切都能正常工作。这给我在构建工具方面带来了很大的麻烦,它的工作有点不稳定 :)

4

我喜欢的一个工具是virtualenv: http://pypi.python.org/pypi/virtualenv

来自该网站的介绍: 它的作用是创建隔离的Python环境。 基本问题是解决依赖和版本的问题,以及间接的权限问题。想象一下,您有一个需要LibFoo版本1的应用程序,但另一个应用程序需要版本2。您如何同时使用这两个应用程序?如果将所有内容安装到/usr/lib/python2.4/site-packages(或任何您平台的标准位置),很容易陷入您无意中升级不应该升级的应用程序的境地。

您还可以尝试: http://pypi.python.org/pypi/zc.buildout

来自该网站的介绍: Buildout项目支持创建应用程序,特别是Python应用程序。它提供了从多个部分(Python或其他)组装应用程序的工具。一个应用程序实际上可能包含多个程序、进程和配置设置。

我试过几次,非常适合部署开发环境,也许对你的需求来说太复杂了。

我也被告知并在几个地方读到,nose是一个非常酷的测试工具http://somethingaboutorange.com/mrl/projects/nose/0.11.1/,我正在寻找一些空闲时间来尝试它。

希望这有所帮助 祝好, Ale


3
如果您只是想要一个独立的可执行文件,您不需要运行Cython。有一些很好的库可以做到这一点:
为了避免像jwp那样的回答,请注意,对于这个项目,我绝对需要我的程序成为一个独立的可执行文件,因为在目标平台上运行可执行文件时无法使用Python VM。我有完全相同的硬件进行编译,所以幸运的是我不需要交叉编译(但我会在更友好的Linux上进行开发)。
我还想测试我的代码是否从一开始就可以在Cython中编译,而不是过早地优化,只是为了确保我没有过度使用不兼容的功能,如果真正需要Cython,那么将需要痛苦的重构。
然而,要运行Python代码,您只需在目标机器上以某种形式安装解释器或虚拟机即可。我提出的解决方案仅涉及嵌入解释器,使其更易于安装。实际上,我相当确定(但可能错了)Cython不允许您构建独立的可执行文件,它主要用于创建Python解释器的扩展。
然而,还有几个其他选择。如果您在目标机器上有Java解释器,则可以运行Jython。还有一个面向.net的IronPython。但是,您仍然必须将这些语言的运行时与您的项目一起分发。
简而言之,如果您想要没有依赖关系的独立可执行文件,您唯一的选择基本上就是使用纯C或C ++。

谢谢您的信息。正如我在问题中所写,这是linux/unix系统,因此py2exe和py2app不是正确的工具。我评估了freeze.py,但最终选择了pyInstaller,正如我在问题中也提到的那样。最后,是的,Cython(单独)不能构建独立可执行文件,但pyInstaller可以(并且它与pyInstaller很好地配合)。 - Davide

1

如果您正在寻找一款简单的基于Python的构建工具,请查看pynt。在pynt中,任务只是(装饰过的)Python函数。它还支持Rake风格的参数传递到任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接