【问题标题】:which build tool(s) do you recommend for python? [closed]您为 python 推荐哪种构建工具? [关闭]
【发布时间】:2010-10-26 14:40:39
【问题描述】:

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

我知道在 python 中你可能不需要构建工具,但我会,因为我将使用 cython 和 PyInstaller(这东西应该在几个不同的 UNIX 上工作,而不直接依赖于 python),我会比如从 CLI 中选择测试、构建文档、检查依赖项等的便利性。

Somebody 抱怨 python 缺少类似 make 的工具。 我知道很少有工具存在,比如sconpaver,但我想听听真实用户的意见,而不仅仅是他们的网站。有人用paver吗?

许多软件包附带的通常 setup.py 是什么?查了几个,看看有没有通用的用法,没发现什么有趣的(可能是我用错了例子)

您是否建议至少在开始时坚持使用我已经知道的东西(ant 和 Makefile)?如果是这样,您是否为 python (+cython+pyinstaller+pyUnit) 推荐了任何 ant 扩展?


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

我还想测试我的代码是否从一开始就在 Cython 中编译,不是为了过早优化,而是为了确保我不会在使用不兼容的功能方面走得太远,这需要痛苦如果严重需要 Cython,请重构。

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

【问题讨论】:

    标签: python unit-testing tdd build-automation pyinstaller


    【解决方案1】:

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

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

     project-dir/
      setup.py
      mypkg/
       __init__.py
       mymod.py
       test/
        __init__.py
        testall.py
        testsomething_specific.py
    

    【讨论】:

    • +1:在你绝对需要它们之前避免使用构建工具和 C,并且可以证明你有正确的算法,但它太慢了。在你能证明你需要 C 之前,请避免使用它。
    • 我理解这一点,并且大体上同意。但在这种特定情况下,我从一开始就绝对需要 C。我可以避免优化(可能还有 Cython),但我需要该程序是一个独立的可执行文件(以及因此 pyInstaller),因为在目标平台上拥有一个 python VM 不是一个选项。我还想测试我的代码是否可以在 Cython 中编译,以确保在严重需要 Cython 时,我不会使用不兼容的功能走得太远,这会使它变得无用。
    • Cython 很不错。只需避免代码中的闭包,其余的将是次要的重构(好吧,我已经看到关于 cython-dev 的闭包的讨论,因此这可能不再是必要的做法)。 AFA 绝对需要 C,你见过 ctypes 模块吗?还是 Python 扩展模块不够用?我没用过pyInstaller,是不是跟py2exe一样?可以发誓 py2exe 与 setuptools/distutils 一起工作。 Cython 将使 纯 Python 速度提高 30%。如果此应用程序要求性能,您可能会想要更多。 (即“cython lang”或 C)
    • 简而言之,除了pyInsaller,我不明白为什么distutils 不够用。过去使用 Cython 时,我手动生成 .c 文件,将其检入 scm,然后使用 distutils 构建扩展模块。但是,我是在完成编写和测试 .py 文件后才这样做的。
    • 问:我怎么做X? A:我不明白你为什么要做X,试试Y...-1
    【解决方案2】:

    您的要求建议使用Scons,根据他们的网站,它比Paver 更能控制各种构建任务。在后者中,您最终会使用大量运行常规命令行程序的sh()

    最近,我开始使用 Paver,它非常适合运行测试,使用 Sphinx 构建文档,但我只使用纯 Python。 如果您想了解 Paver 的功能,我强烈推荐这两篇文章: converting-from-make-to-paverwriting-technical-documentation 由 Doug Hellmann 撰写,你肯定想查看他的 pavement.py configuration file

    【讨论】:

      【解决方案3】:

      为此我一直在使用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

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

        你也可以试试:http://pypi.python.org/pypi/zc.buildout

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

        尝试了几次,非常适合部署开发环境,也许它对您的需求来说太多了。

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

        希望对你有帮助 干杯, 麦芽酒

        【讨论】:

          【解决方案5】:

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

          我还想测试我的代码是否从一开始就在 Cython 中编译,不是为了过早优化,而是为了确保我不会在使用不兼容的功能方面走得太远,这需要痛苦如果严重需要 Cython,请重构。

          如果您只想拥有一个独立的可执行文件,则无需运行 Cython。有几个很好的库可以做到这一点:

          但是,要运行 Python 代码,您只需必须以某种形式或方式在目标机器上安装解释器或虚拟机。我提出的解决方案仅涉及嵌入解释器以使其更易于安装。事实上,我很确定(但可能是错误的)Cython 不允许您构建独立的可执行文件。它主要用于创建 Python 解释器的扩展。

          但是,还有其他几种选择。如果目标机器上有 Java 解释器,则可以运行 Jython。 .net 还有一个IronPython。但是,您仍然需要为您的项目分发这些语言的运行时。

          简而言之,如果您想要一个没有依赖关系的独立可执行文件,您唯一的选择几乎就是直接使用 C 或 C++。

          【讨论】:

          • 感谢您的留言。正如我在问题中所写,这是 linux/unix,因此 py2exe 和 py2app 不是正确的工具。正如我在问题中提到的那样,我评估了 freeze.py 但最终选择了 pyInstaller。最后是的,Cython(单独)不允许构建独立的可执行文件,但 pyInstaller 可以(并且它与 pyInstaller 配合得很好)
          【解决方案6】:

          如果您正在寻找一个简单的基于 python 的构建工具。查看pyntpynt 中的任务只是(装饰的)python 函数。它还支持将 Rake 样式参数传递给任务。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-04
            • 2010-12-22
            • 2010-09-16
            • 1970-01-01
            • 2010-09-15
            相关资源
            最近更新 更多