如何使Python脚本独立可执行文件在没有任何依赖的情况下运行?


705

我正在构建一个Python应用程序,不想强制我的客户端安装Python和模块。

因此,有没有办法将Python脚本编译为独立的可执行文件?


307
问题的一部分说:“我不想强迫客户安装Python和模块。” 并不是说客户不能做到这一点,而是说开发人员不想让他们这样做。没有必要在这里讨论这一点,因为客户不会读SO自己说话。我不想安装Flash开发环境只是为了观看youtube,或者不想安装C开发环境只是为了玩Sudoku,也不想安装Python开发环境来运行用Python编写的《愤怒的小鸟》。这就是可再分发运行时的用途。
戴夫

Answers:


243

您可以使用已经回答的py2exe并使用cython来转换C编译文件中的密钥.py文件.pyc,例如.dll在Windows和.solinux中,它比普通文件.pyo.pyc文件要难得多(并且还可以提高性能!)


1
感谢您的回答。我考虑过Cython,但似乎仍然需要Python才能运行编译的可执行文件。您的意思是使用Cython将脚本编译为.pyc吗?(我不知道Cython是否具有这样的功能)
Jeff

9
我的意思是您有两个问题:封闭源代码和禁止使用。对于封闭源,请使用Cython在C库中编译重要的代码。对于不精打细算的人,请使用py2exe并使用其中的.pyd(经cython编译)文件制作可执行文件。
neurino 2011年

7
您将如何处理这些库(numpy,scipy,matplotlib)?例如,客户端如何能够从可执行文件中使用matplotlib中的ginput()函数,而无需将其安装在其计算机上。
chimpsarehungry 2013年

@chimpsarehungry静态链接如何?
Braden Best

11
上次发布时间似乎是2008年,是否仍保持不变?
Zitrax

302

您可以使用PyInstaller将Python程序打包为独立的可执行文件。它适用于Windows,Linux和Mac。

PyInstaller快速入门

从PyPI安装PyInstaller:

pip install pyinstaller

转到程序的目录并运行:

pyinstaller yourprogram.py

这将在名为的子目录中生成捆绑包dist

有关更详细的演练,请参见手册


10
值得注意的是pyinstaller可以编译为单个.exe文件。同样在哪个OS上运行,也使可执行文件运行,即在Windows上运行时为.exe
Richard de Wit 2014年

2
@ ItayMoav-Malimovka他们正在Python 3的支持下工作。请参见github.com/pyinstaller/pyinstaller/tree/python3
PhoneixS

3
正如@GeenHenk所说,如果您在Windows上“编译”它会生成一个exe,请记住您不能在Linux上为Windows编译(使一个exe),或者在Windows上不能使Linux可执行。您只能使所运行平台的可执行文件。(在Linux中,您可以使用wine来欺骗它)
PhoneixS 2015年

14
使用“ pyinstaller”比“ py2exe”更容易。它会处理所有依赖项,包括numpy,pandas和其他所有内容,并在工作平台上提供一个可执行文件!
AKS

12
似乎正是我想要的。现在支持Python 3!谢谢:)
Daniel Gruszczyk '16

83

您可能希望调查 Nuitka。它需要python源代码并将其转换为C ++ API调用。然后将其编译为可执行二进制文件(在Linux上为ELF)。它已经存在了几年,并且支持多种Python版本。

如果使用它,您可能还会获得性能上的改进。推荐的。


5
Nuitka是一个很棒的工具。无需使用它。我只想指出一件事-它不仅限于Linux-它是跨平台的 -使用它的另一个原因。
sjaustirni 2014年

5
Nuitka可以在Python 2.6、2.7、3.2、3.3和3.4上运行,并且可以跨平台使用:(Linux,FreeBSD,NetBSD,MacOS X和Windows(32/64位)。其他也可以使用。架构:x86, x86_64(amd64)和arm。其他架构也可以使用,即装即用。)
Jonathan Hartley 2015年

最新的3.6 ..版本不支持此功能,并且它是在Windows上设置的噩梦
Tetora

在macOS High Sierra + Python 3.5.2上像魅力一样工作。谢谢!
Anthony L.

这会创建一个独立的可执行文件吗?
声音

31

我想汇编一些有关使用Python 2.7在Windows上创建独立文件的有用信息。

我已经使用了py2exe,并且可以使用,但是我遇到了一些问题。

这最后一个原因使我尝试使用PyInstaller http://www.pyinstaller.org/

我认为,这样做更好,因为:

  • 它更易于使用。

我建议例如使用以下几行创建一个.bat文件(pyinstaller.exe必须在Windows路径中):

pyinstaller.exe --onefile MyCode.py

因此,我认为,至少对于python 2.7,更好和更简单的选择是PyInstaller。


3
--onefile标志不会帮助您使其在Windows上可移植,因为该可执行文件仍然希望链接到api-ms-win-crt-runtime-l1-1-0.dll必须通过vcredist软件包安装的库(或/和其他库)。因此,依存关系仍然存在,必须在运行之前安装它。
安德里(Andry)

27

是的,可以将Python脚本编译成独立的可执行文件。

WindowsLinuxMac OS XFreeBSDSolarisAIX下,可以使用PyInstaller将Python程序转换为独立的可执行文件。它是推荐的转换器之一。

py2exe将Python脚本转换为仅Windows平台上的可执行文件。

Cython是用于Python编程语言和扩展的Cython编程语言的静态编译器。


2
谢谢你 我正在使用py2exe,并且根本无法使用图标。PyInstaller第一次工作,看起来很棒!
Chud37年

我可以从Windows为Linux和macOS创建独立的可执行文件吗?还是应该在VirtualBox上安装Linux和macOS?我的笔记本电脑上没有足够的可用空间。
8Observer19年

1
我在这里的文档中找到了关于我的问题的答案:pyinstaller.readthedocs.io/en/stable/…–
8Observer8

26

第三个选择是cx_Freeze,它是跨平台的。


1
我们现在是2019年2月,cx_Freeze自2017年底以来pypi 上没有列出任何发行版。这个项目是否被放弃了?
user9074332 '19


14

使用py2exe...。使用以下设置文件:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )

我这样做了,它创建了一个python27.dll文件,仍然是必需的。我将.exe文件从保存了python27.dll文件的文件夹中移出,并且该.exe文件不再运行。
mjwrazor

您可以显示适用于Linux和macOS的脚本吗?我想从Windows为Linux和macOS创建独立的可执行文件。
8Observer19年

13

我喜欢pyinstaller-尤其是“窗口式”变体:

pyinstaller --onefile --windowed myscript.py

它将在dist /文件夹中创建一个单个* .exe文件。


11

我还建议使用 pyinstaller 以获得更好的向后兼容性,例如python 2.3-2.7
对于py2exe,您必须具有python 2.6


pyinstaller出现导入问题。例如:就我而言,我在此DIR〜/ Documents / python101 /中,而ex50_pycomp.py和ex50.py在此目录中。ex50_pycomp.py导入ex50.py。我运行pyinstaller ex50_pycomp.py,我看到所有已编译的dist。好吧?我进入dist / ex50_pycomp /并运行ex50_pycomp即可。将这个ex50_pycom放入虚拟机后,它说导入错误,并且在另一个其他的Linux框中,它说“ -bash:./ex_50_pycom:无法执行二进制文件:Exec格式错误”
drive_spider

prob1:我使用的是python2.7,但pyinstaller正在与python3进行交谈python3 setup.py构建python3 setup.py安装,您的python3将获得所有pkg_resources的问题3:如果使用sys_path成为问题,请给您这样的路径pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path:python3的dist文件夹pyinstaller --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
drive_spider

8

对于Python 3.2脚本,唯一的选择是Cxfreeze。从源代码构建它,否则它将不起作用。

对于python 2.x,我建议使用pyinstaller,因为它可以将python程序打包在单个可执行文件中,这与CxFreeze也输出库的方式不同。



6

你可以找到的上市@配电公司名单https://wiki.python.org/moin/DistributionUtilities

我使用bbfreeze,并且运行良好(虽然还支持python 3)。


stackoverflow.com/questions/33683133/…我使用bbfreeze非常好的程序包。
user914425

它会处理依赖关系并安装相关的py模块吗?
Volatil3'5

@ Volatil3是的,所有依赖项均已处理。WRT用于在主机系统上安装模块-有不同类型的编译。bbfreeze会将所有内容编译为多个.so文件,或直接复制.egg文件,并且它们都应存在于单个目录中(或作为单个文件存在)。无需安装。

6
pyinstaller yourfile.py -F --onefile

这将在Windows中创建一个独立的EXE文件。重要说明:该exe文件将在名为“ dist”的文件夹中生成。

您可以使用安装pyinstaller pip install PyInstaller

在此处输入图片说明

在此处输入图片说明


4

不完全是python代码的打包,但是google 现在也有脾气暴躁的人,它将代码转换为Go。它不支持python C api,因此它可能不适用于所有项目。


4

使用pyinstaller,我发现了使用.exe快捷方式而不是make的更好方法--onefile。无论如何,周围可能都有一些数据文件,如果您正在运行基于站点的应用程序,则您的程序也将依赖于html,js,css文件。将所有这些文件移到某个地方没有意义..相反,如果我们将工作路径向上移怎么办。

为exe创建快捷方式,将其移动到顶部,并按指定设置目标路径和开始路径,以使相对路径进入dist \ folder: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" 可以将快捷方式重命名为任何名称,从而重命名为“ GTFS-Manager”
现在当我双击-单击快捷方式,就好像我是python运行文件一样!我发现这种方法比以下方法更好--onefile

  1. 在onefile的情况下,存在Win7 OS缺少.dll的问题,该文件需要事先安装等。使用具有多个文件的常规构建,不会出现此类问题。
  2. 我的python脚本使用的所有文件(正在部署龙卷风Web服务器,并且需要整个freakin'网站上有价值的文件!)不需要移动到任何地方:我只是在顶部创建了快捷方式。
  3. 我实际上可以在ubuntu(运行python3 myfile.py)和Windows(双击快捷方式)中使用完全相同的文件夹。
  4. 我不需要为.spec文件的过于复杂的黑客行为而烦恼,以包括数据文件等。

哦,切记在构建后删除构建文件夹,这样可以节省大小。


嗨,刚刚更新。我决定放弃UPX压缩,最后走--onefile方式。必须选择一个,因为UPX当前在压缩特定DLL时存在错误。
Nikhil VJ

3

使用Cython转换为c,编译并与gcc链接。另一个可能是,在c中创建核心功能(要使其难以逆转的功能),对其进行编译,然后使用python boost导入已编译的代码(此外,您还将获得更快的代码执行速度)。然后使用提到的任何工具进行分发。


1

有人告诉我PyRun,https://www.egenix.com/products/python/PyRun/ 也是一种选择。


5
欢迎使用指向解决方案的链接,但是请确保没有该链接的情况下,您的回答是有用的:在链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接。只是链接的答案可能会被删除。
佩特·弗里伯格

此选项当前不支持Windows。
鲍勃,
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.