如何分发python程序?


102

我的应用程序如下所示:

main.py
视窗/
    __init__.py
    mainwindow.py
    ...
模型/
    __init__.py
    orders.py
    ...
资源/
    image1.png
    logo.jpg
    ...

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

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

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

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

一个人如何创建一个不错的自动化发行版?

  • 对于Windows?(这是我目前必须支持的唯一平台。)
  • 对于Mac?
  • 对于Linux?

2
“我看过distutils,但这看起来像是将程序安装到Python目录中,这在非Linux平台上并不常见。”为什么这么说?您读过什么文字说明了这一点?当然是不正确的,您从哪里得到的印象?
S.Lott


Answers:


37

分发Python应用程序的常规方法是使用distutils。它既用于分发库类型的python模块,又用于python应用程序,尽管我不知道它在Windows上如何工作。在任何情况下,如果您使用distutils,则必须在Windows上分别安装Python。

我可能会建议您使用Linux的disutils和Windows的Py2exe或类似的软件分发它。对于OS XI不知道。如果它是最终用户应用程序,则可能需要磁盘映像类型的东西,我不知道该怎么做。但是,请阅读这篇文章以获取有关其用户体验的更多信息。对于为程序员开发的应用程序,您也可以在OS X上安装distutils类型。


1
Mac和linux目前还不那么重要。Py2app制作.app捆绑包。而且我认为以.dmg发行Mac应用程序已过时,应该使用.zip。是否可以使用distutils来创建目录dist并将所有相关文件复制到该目录中?
格奥尔格·舍利

1
@gs:sdist命令将创建所有源文件的tar文件。
Martin v。Löwis09年

5
@gs:实际上,以.dmg发行Mac应用程序非常普遍。.dmg是磁盘映像,而不是应用程序的格式(即.app)。因此,通常会在.dmg中找到单个.app以及一些README文件。
Eric O Lebigot 09年

2
@gs我不知道为什么要distutils仅创建目录dist并将文件复制到那里,您可以自己完成。Distutils做很多事情,包括制作Windows安装程序,从Python 2.6开始,Distutils还在开始菜单中创建链接。不过,这将需要您单独安装Python,因此对于最终用户应用程序,我认为py2exe是更好的解决方案,因为它包括它自己的Python。Alexander Limi在他的博客中详细讨论了OS X的运输/安装程序,因此我请他谈谈。
Lennart Regebro


61

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

还要注意,如果要将Python 2.6部署到Windows,则应将此补丁应用到Pyinstaller干线。

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


3
我不确定这是矫kill过正。使用Pyinstaller捆绑应用程序实际上比其他方法更容易,尤其是那些依赖于c扩展的方法……在大多数情况下,与单行命令行调用一样简单。安装Python +依赖关系+应用程序本身(无论是通过distutils等,还是只是一个zip文件)都需要更多的工作,特别是如果开发人员自己无法手动配置目标计算机并需要向客户端提供说明的话。至少在Windows上,我认为分发样式有意义。
Daniel Naab 09年

1
pyinstaller有点不方便,当您使用pyinstaller创建的可执行文件时,开始执行需要花费几秒钟。
JuanPablo 2014年

1
正是我想要的。有时我需要让我的脚本在无法安装任何东西的计算机上运行。我需要一个没有外部依赖项的可执行文件。我可以花几秒钟来启动。谢谢!
CodeMonkey '16

不建议用于小型应用程序,因为一个简单的Hello world程序会占用500MB空间和3-5秒的初始​​化时间。
拉夫

您可以通过使用单独的环境来分发应用程序(例如,使用venv或pyenv)来避免这种数量的空间
Alexander Santos,

4

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

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


4

我认为也值得一提的是PEX(多考虑这个问题引起的关注,而不是问题本身)。根据自己的描述

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

当我阅读python包装概述时偶然发现了它。他们在这里张贴了这张漂亮的照片: 在此处输入图片说明

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



1

如果要在Windows上分发,请使用安装程序来安装所有需要的所有相关文件/网络。分发setup.exe。这是在Windows上的最佳方法。否则,用户会抱怨。


1
我不需要安装程序,因为只有一个用户要使用该程序。但是,当然,在为更多用户编写程序时,这是Windows上必须具备的功能。
格奥尔格·舍利(6

1
@gs:哦,只有一个用户。很好,那么我建议您制作一个基本的distutils软件包,即源代码发行版或Windows二进制安装程序。这绝对是分发Python模块的简便方法。
Lennart Regebro

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.