我的应用程序如下所示:
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
创建一个别名。一些不便之处:
main.py
重命名为main.pyw
。如何创建一个不错的自动分发?
答案 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编译器吗?
[编辑]
试用Cx_Freeze,到目前为止我用过的最好的.py到.exe(以及一些.dll)编译器。
答案 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时偶然发现了它。他们在这里张贴了这张漂亮的照片:
总结:如果可以负担得起依靠目标计算机上安装的python的功能,请使用PEX生成一个自包含的»executable«,例如,其文件大小可能比PyInstaller生成的可执行文件小。
>答案 6 :(得分:0)
分发python桌面应用程序最方便的跨平台方式是依靠跨平台的conda软件包管理器。有几种使用它的工具:
*对开发人员来说最方便。对于最终用户来说足够方便。
答案 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 页长。