我该如何发布python程序?

时间:2009-10-13 05:48:21

标签: python distribution

我的应用程序如下所示:

main.py
windows/
    __init__.py
    mainwindow.py
    ...
model/
    __init__.py
    orders.py
    ...
resources/
    image1.png
    logo.jpg
    ...

该程序以main.py启动。有没有一种好方法可以创建一个“最终”应用程序?我正在考虑像py2exe / py2app这样的东西,但是没有将python解释器/模块复制到只有一个可执行文件的应用程序中。

我看了一下distutils,但这看起来像将程序安装到Python目录中,这在非Linux平台上并不常见。

目前我只是将整个源文件夹复制到目标计算机上,并在Windows上为main.pyw创建一个别名。一些不便之处:

  • 图标是默认的python图标。
  • 我必须手动创建别名。
  • 在我的源目录中,还有很多其他文件,例如源代码管理文件夹。
  • 我必须手动将main.py重命名为main.pyw
  • 如果目标机器上只有`.pyo *文件,那就太好了。没有真正的理由,我只是不喜欢有不必要的文件。

如何创建一个不错的自动分发?

  • 对于Windows? (这是我目前唯一需要支持的平台。)
  • for mac?
  • for linux?

8 个答案:

答案 0 :(得分:57)

我强烈推荐Pyinstaller,它可以非常无缝地支持所有主要平台。像py2exe和py2app一样,它在Windows上生成一个标准可执行文件,在OS X上生成一个应用程序包,但它的好处是可以自动解决常见的依赖关系,并且无需额外的配置调整就可以包含它们。

另请注意,如果要将Python 2.6部署到Windows,则应将this patch应用于Pyinstaller trunk。

您表示您不需要安装程序,但Inno Setup是Windows平台易于使用且快速设置的选择。

答案 1 :(得分:33)

分发Python应用程序的常规方法是使用distutils。它既用于分发库类型python模块,也用于python应用程序,虽然我不知道它在Windows上是如何工作的。如果你使用distutils,你必须在Windows上单独安装Python。

我可能建议您使用disutils for Linux,Py2exe或类似的Windows进行分发。对于OS X,我不知道。如果它是最终用户应用程序,您可能想要一个磁盘映像类型的东西,我不知道该怎么做。但请阅读this post以获取有关其用户体验的更多信息。对于为程序员制作的应用程序,您可能也可以在OS X上安装distutils类型。

答案 2 :(得分:5)

Fredrik Lundh的squeeze.py可以创建一个不包含Python解释器的文件,而是包含字节码。使用正确的参数,您可以在结果文件中包含其他文件,模块等。我在一个项目中成功使用了它。生成的程序在OS X,Linux和Windows上运行没有任何问题!

PS :每台机器都需要一个Python解释器,它与squeeze.py生成的字节码兼容。如果需要,您可以为不同版本的Python生成不同的字节码版本(只需使用正确版本的Python运行squeeze.py)。

答案 3 :(得分:2)

我可能弄错了,但是IronPython没有内置的Windows编译器吗?

http://www.ironpython.net

[编辑]

试用Cx_Freeze,到目前为止我用过的最好的.py到.exe(以及一些.dll)编译器。

http://cx-freeze.sourceforge.net/

答案 4 :(得分:1)

如果要在Windows上分发,请使用installer安装所有相关文件/ interpeter。分发setup.exe。这是Windows上的最佳方式。否则用户会抱怨。

答案 5 :(得分:1)

我认为同样值得一提的是PEX(考虑的更多是此问题的关注,而更少的是问题本身)。根据其own description

  

PEX文件是自包含的可执行Python虚拟环境。更具体地说,它们是经过精心构造的zip文件,带有#!/usr/bin/env python和特殊的__main__.py,可让您与PEX运行时进行交互。有关zip应用程序的更多信息,请参见PEP 441

我在读an overview of packaging for python时偶然发现了它。他们在这里张贴了这张漂亮的照片: enter image description here

总结:如果可以负担得起依靠目标计算机上安装的python的功能,请使用PEX生成一个自包含的»executable«,例如,其文件大小可能比PyInstaller生成的可执行文件小。 >

答案 6 :(得分:0)

分发python桌面应用程序最方便的跨平台方式是依靠跨平台的conda软件包管理器。有几种使用它的工具:

  • Miniconda-Install-Powershell / bash脚本,可自动下载Miniconda并为应用创建隔离的conda环境。支持pip,但似乎无法维护,并且存在https下载问题。
  • Anaconda Project(conda) constructor,来自Continuum。两者都使用conda。 (conda)构造函数似乎可以在Windows上创建自包含的安装程序,甚至NSIS安装程序,但不支持pip。看起来像Anaconda / Miniconda安装程序。
  • PyAppShare-最终用户首先安装Miniconda / Anaconda(类似于运行时环境)。然后,单次安装批处理/ bash脚本从yaml规范创建隔离的conda环境。该应用程序本身也是一个conda / pip程序包,已安装到环境中并创建了一个可执行的入口点。自动创建跨平台的“桌面和程序”快捷方式。他们激活环境并启动应用程序。支持点子。

*对开发人员来说最方便。对于最终用户来说足够方便。

答案 7 :(得分:0)

对于 Windows,我发现 py2exe 非常易于使用。

pip install distutils
pip install py2exe

只需要 setup.py 中的几行代码:

from distutils.core import setup
import py2exe

setup(console=['hello.py'])

Py2exe 构建一个可执行文件并包含所有依赖项。您可能需要在构建 exe 之前手动添加 C++ 运行时:

from glob import glob
data_files = [("Microsoft.VC90.CRT", glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
setup(
    data_files=data_files,
    ...
)

https://py2exe.org 有一个漂亮而简单的教程,大约 3 页长。