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

Jef*_*eff 611 python executable

我正在构建一个Python应用程序,不想强迫我的客户端安装Python和模块.我也想让我的应用程序闭源.

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

Rum*_*kin 244

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

PyInstaller快速入门

从PyPI安装PyInstaller:

pip install pyinstaller
Run Code Online (Sandbox Code Playgroud)

转到程序的目录并运行:

pyinstaller yourprogram.py
Run Code Online (Sandbox Code Playgroud)

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

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

  • 正如@GeenHenk 所说,如果你在 Windows 上“编译”它会生成一个 exe,请记住你不能在 Linux 上为 Windows 编译(生成一个 exe),或者在 Windows 上生成一个 Linux 可执行文件。您只能制作您正在运行的平台的可执行文件。(在 Linux 中你可以使用 wine 来欺骗这个) (11认同)
  • 似乎正是我想要的.现在支持Python 3!谢谢 :) (10认同)
  • 使用'pyinstaller'比'py2exe'更容易.它负责处理所有依赖项,包括numpy,pandas,any,并在工作平台上为您提供单个可执行文件! (9认同)
  • 值得注意的是,pyinstaller可以编译为单个.exe文件.此外,它在哪个操作系统上运行,使**可执行,即在Windows上运行时的.exe (5认同)
  • @ ItayMoav-Malimovka他们正在支持Python 3.请参阅https://github.com/pyinstaller/pyinstaller/tree/python3. (2认同)
  • 我尝试了所有这些,PyInstaller和其他人(py2exe,冻结,cython,嵌入版本的python等)仍然无法处理python动态库本身的依赖性,至少在Windows(python*.dll)中.dll依赖于单独安装的运行时.在此过程之后,您将获得将链接到dll的可执行文件,因此具有相同的可导入性.所以你的'独立'可执行文件不是很独立,而是更像嵌入式.要解决运行时依赖性,您必须使用`cpython`项目从源重建python. (2认同)
  • 这个答案是不正确的:这不是一个独立的exe,它仍然需要安装python和其他东西。 (2认同)

neu*_*ino 214

您可以使用已经回答的py2exe并使用cython将您的密钥.py文件转换为.pycC编译文件,比如.dll在Windows和.soLinux中,比普通文件.pyo.pyc文件更难恢复(并且还可以获得性能!)

  • 最新版本似乎是在2008年,这仍然是保持? (10认同)
  • 我的意思是你有*两个问题*:闭源和无法解决.对于闭源,使用Cython在C库中编译_important_代码.对于no-deps,使用py2exe并使用.pyd(cython编译)文件生成可执行文件. (8认同)
  • 你会对这些库做什么(numpy,scipy,matplotlib)?例如,客户端如何能够在可执行文件的matplotlib中使用ginput()函数,而无需在其计算机上安装它. (5认同)

cda*_*rke 77

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

如果使用它,您可能也会获得性能提升.推荐的.

  • Nuitka是一个很棒的工具.不必使用它.我只指出一件事 - 它不仅限于Linux - 它是_cross-platform_ - 使用它的另一个原因. (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.其他架构也可以开箱即用.) (5认同)
  • 这会创建一个独立的可执行文件吗? (2认同)

Die*_*ego 27

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

我使用过py2exe它可以工作,但我遇到了一些问题.

最后一个原因让我尝试了PyInstaller http://www.pyinstaller.org/.

在我看来,它更好,因为:

  • 它更容易使用.

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

pyinstaller.exe --onefile MyCode.py
Run Code Online (Sandbox Code Playgroud)

所以,我认为,至少对于python 2.7,更好更简单的选择是PyInstaller.

  • `--onefile`标志不会帮助你在Windows上移植它,因为可执行文件仍然想要链接到`api-ms-win-crt-runtime-l1-1-0.dll`库(或/和其他)必须通过`vcredist`包安装.所以依赖仍然存在,必须在运行之前安装. (2认同)

Kat*_*iel 25

第三种选择cx_Freeze是跨平台的.

  • 我们现在是 2019 年 2 月,自 2017 年底以来,pypi 上没有列出 `cx_Freeze` 版本。这个项目被放弃了吗? (2认同)

fur*_*lay 23

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

PyInstaller可用于在Windows,Linux,Mac OS X,FreeBSD,SolarisAIX下将Python程序转换为独立的可执行文件.它是推荐的转换器之一.

py2exe将Python脚本转换为Windows平台中的可执行文件.

Cython是Python编程语言和扩展的Cython编程语言的静态编译器.

  • 谢谢你。我正在使用 py2exe,并且根本无法使用它的图标。PyInstaller 第一次工作,看起来很棒! (2认同)

Cha*_*uad 21

pyinstaller yourfile.py -F --onefile
Run Code Online (Sandbox Code Playgroud)

这会在 Windows 上创建一个独立的 EXE 文件。

重要说明 1:EXE 文件将在名为“dist”的文件夹中生成。

重要说明 2:不要忘记 --onefile 标志

您可以使用安装 PyInstaller pip install PyInstaller

在此处输入图片说明

在此处输入图片说明

注意:在极少数情况下,存在隐藏的依赖项...因此,如果您运行 EXE 文件并出现缺少库错误(在下面的示例中为 win32timezone),请使用以下内容:

pyinstaller --hiddenimport win32timezone -F "Backup Program.py"
Run Code Online (Sandbox Code Playgroud)


use*_*419 17

你可能喜欢py2exe.你也会在那里找到在linux上做这件事的信息

  • 但是你需要给它包装所有选项. (2认同)

Ana*_*and 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()
     )
Run Code Online (Sandbox Code Playgroud)


yan*_*taq 9

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


小智 8

对于Python 3.2脚本,唯一的选择是Cxfreeze.从源代码构建它,否则它将无法工作.

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


Bel*_*ial 6

py2exe将生成您想要的exe文件,但您需要在将要使用新exe的机器上安装相同版本的MSVCR90.dll.有关详细信息,请参阅http://www.py2exe.org/index.cgi/Tutorial.


Joe*_*Joe 6

您可以找到@ https://wiki.python.org/moin/DistributionUtilities列出的分发实用程序列表.

我使用bbfreeze并且它一直运行良好(但仍然支持python 3).


F.M*_*ure 6

使用Cython转换为 C、编译并与 GCC 链接。

另一种可能是,用 C 语言编写核心函数(您想要使其难以逆转的函数),编译它们并使用Boost.Python导入编译后的代码(而且您可以获得更快的代码执行速度)。然后使用提到的任何工具进行分发。


csl*_*tty 6

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

pyinstaller --onefile --windowed myscript.py
Run Code Online (Sandbox Code Playgroud)

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

  • @AbdullahSaid 目标系统不需要单独安装Python,它打包在生成的exe文件中。否则这就没多大意义了。执行时,exe 文件会将自身解压到自己的临时文件夹中,并从那里获取所有内容! (3认同)

fre*_*rmz 5

不完全是 Python 代码的打包,但现在还有来自 Google 的Grumpy,它将代码转换为Go

它不支持 Python C API,因此可能不适用于所有项目。


Nik*_* VJ 5

使用PyInstaller,我找到了一种更好的方法,使用 .exe 的快捷方式而不是制作--onefile. 不管怎样,周围可能有一些数据文件,如果您正在运行基于站点的应用程序,那么您的程序也依赖于 HTML、JavaScript 和 CSS 文件。将所有这些文件移动到某个地方没有任何意义...相反,如果我们将工作路径向上移动怎么办?

\n

创建 EXE 文件的快捷方式,将其移动到顶部并按指定设置目标和起始路径,以使相对路径指向dist\\folder

\n
Target: %windir%\\system32\\cmd.exe /c start dist\\web_wrapper\\web_wrapper.exe\nStart in: "%windir%\\system32\\cmd.exe /c start dist\\web_wrapper\\"\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以将快捷方式重命名为任何名称,因此重命名为“GTFS-Manager”。\n现在,当我双击快捷方式时,就好像我python运行了该文件一样!我发现这种方法比--onefile 以下方法更好:

\n
    \n
  1. 在 onefile 的情况下,Windows\xc2\xa07 操作系统存在缺少 .dll 的问题,需要事先安装等。打哈欠。使用多个文件的通常构建,没有这样的问题。
  2. \n
  3. 我的 Python 脚本使用的所有文件(它正在部署一个龙卷风 Web 服务器,并且需要一个完整的奇怪网站的文件!)不需要移动到任何地方:我只需在以下位置创建快捷方式:顶部。
  4. \n
  5. 实际上,我可以在Ubuntu(运行python3 myfile.py)和 Windows(双击快捷方式)上使用这个完全相同的文件夹。
  6. \n
  7. 我不需要费心对 .spec 文件进行过于复杂的黑客攻击以包含数据文件等。
  8. \n
\n

哦,记得在构建后删除构建文件夹。它将节省尺寸。

\n


jde*_*esa 5

由于当前的答案列表中似乎缺少它,我认为值得一提的是,标准库包含一个zipapp可用于此目的的模块。它的基本用法只是压缩了一堆Python文件与扩展名的zip文件.pyz比可以作为直接执行python myapp.pyz,但你也可以从一个做一个独立的程序包requirements.txt文件:

$ python -m pip install -r requirements.txt --target myapp
$ python -m zipapp -p "interpreter" myapp
Run Code Online (Sandbox Code Playgroud)

哪里interpreter可以是类似的/usr/bin/env python(见指定解释器)。

通常,生成的.pyz/.pyzw文件应该是可执行的,在 Unix 中因为它被标记为这样,在 Windows 中因为 Python 安装通常会注册这些扩展。但是,制作一个只要用户python3.dll在路径中就可以工作的 Windows 可执行文件相对容易。

如果您不想要求最终用户安装 Python,则可以将应用程序与可嵌入的 Python 包一起分发。