如何使 Python 脚本独立可执行以在没有任何依赖项的情况下运行? [复制]

Posted

技术标签:

【中文标题】如何使 Python 脚本独立可执行以在没有任何依赖项的情况下运行? [复制]【英文标题】:How can I make a Python script standalone executable to run without ANY dependency? [duplicate] 【发布时间】:2011-07-24 09:40:53 【问题描述】:

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

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

【问题讨论】:

问题中“我不想强迫我的客户安装 Python 和模块”的部分。这并不是说客户不能这样做,而是说开发人员不想要求他们这样做。在这里辩论这一点没有意义,因为客户不是在阅读 SO 来为自己说话。我不想安装 Flash 开发环境来观看 youtube,或者安装 C 开发环境来玩数独,或者安装 Python 开发环境来运行用 Python 编写的愤怒的小鸟版本。这就是可再发行运行时的用途。 包含许多文件但只有一个用于运行应用程序的答案是否可以接受?我正在考虑使用可移植的 Python 分发包对应用程序 + 需求进行某种自动化打包,并制作一个安装脚本来自动化它。 【参考方案1】:

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

PyInstaller 快速入门

从 PyPI 安装 PyInstaller:

pip install pyinstaller

进入你的程序目录并运行:

pyinstaller yourprogram.py

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

pyinstaller -F yourprogram.py

添加 -F(或 --onefile)参数会将所有内容打包到单个“exe”中。

pyinstaller -F --paths=<your_path>\Lib\site-packages  yourprogram.py

遇到“ImportError”,您可能会考虑使用附加包。

 pip install pynput==1.6.8

仍在 Import-Erorr 中运行 - 尝试降级 pyinstaller - 请参阅 Getting error when using pynput with pyinstaller

如需更详细的演练,请参阅manual。

【讨论】:

值得注意的是,pyinstaller 可以编译成单个 .exe 文件。同样在哪个操作系统上运行,使 that 可执行,即在 Windows 上运行时的 .exe 正如@GeenHenk 所说,如果你在 Windows 上“编译”它会生成一个 exe,请记住,你不能在 Linux 上为 Windows 编译(制作一个 exe),或者在视窗。您只能制作您正在运行的平台的可执行文件。 (在 Linux 中你可以使用 wine 来欺骗) 使用“pyinstaller”比“py2exe”容易得多。它负责处理所有依赖项,包括 numpy、pandas 等,并为您提供工作平台上的单个可执行文件! 看起来正是我想要的。现在支持 Python 3!谢谢:) 我都试过了,PyInstaller 和其他的(py2exe、freeze、cython、python 的嵌入式版本等)至少在 Windows 中仍然无法处理 python 动态库本身的依赖关系(python *.dll)。 dll 依赖于必须单独安装的运行时。在此过程之后,您将获得将链接到 dll 的可执行文件,因此具有相同的可导入性。因此,您的“独立”可执行文件并不是独立的,而更像是可嵌入的。要解决运行时依赖项,您必须使用 cpython 项目从源代码重建 python。【参考方案2】:

您可以使用已回答的py2exe 并使用Cython 转换.pyc 中的密钥.py 文件,C 编译文件,如Windows 中的.dll 和Linux 中的.so

还原比普通的.pyo.pyc 文件要困难得多(而且性能也会提高!)。

【讨论】:

感谢您的回答。我考虑过 Cython,但它似乎仍然需要 Python 来运行已编译的可执行文件。您的意思是使用 Cython 将脚本编译为 .pyc 吗? (不知道Cython有没有这个功能) 我的意思是你有两个问题:闭源和无依赖。对于封闭源代码,使用 Cython 在 C 库中编译您的 重要 代码。对于 no-deps,使用 py2exe 并在其中制作一个包含 .pyd(cython 编译)文件的可执行文件。 你会如何处理库(numpy、scipy、matplotlib)?例如,客户端如何能够从可执行文件中使用 matplotlib 中的 ginput() 函数,而无需在他们的计算机上安装它。 @chimpsarehungry 静态链接怎么样? 最后一个版本似乎是在 2008 年,这仍然保持吗?【参考方案3】:

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

如果您使用它,您可能还会获得性能提升。推荐。

【讨论】:

Nuitka 是一个很棒的工具。没有必要不用它。我只想指出一件事——它不仅限于 Linux——它是跨平台——另一个使用它的原因。 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。其他架构也可以工作,开箱即用。) 最新的 3.6.. 不支持它,在 windows 上设置是一场噩梦 在 macOS High Sierra + Python 3.5.2 上像魅力一样工作。谢谢! 这会创建一个独立的可执行文件吗?【参考方案4】:

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

PyInstaller 可用于将 Python 程序转换为独立的可执行文件,在 WindowsLinuxMac OS X、FreeBSD、SolarisAIX。它是推荐的转换器之一。

py2exe 将 Python 脚本转换为只能在 Windows 平台上执行的脚本。

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

【讨论】:

谢谢。我使用的是py2exe,根本无法使用它的图标。 PyInstaller 第一次工作,看起来很棒! 我可以从 Windows 为 Linux 和 macOS 创建独立的可执行文件吗?或者我应该在 VirtualBox 上安装 Linux 和 macOS?我的笔记本电脑上没有足够的可用空间。 我在这里的文档中找到了我的问题的答案:pyinstaller.readthedocs.io/en/stable/…【参考方案5】:

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

我使用过 py2exe 并且可以正常工作,但是我遇到了一些问题。

在 Windows 64 位中创建单个文件时出现了一些问题:Using bundle_files = 1 with py2exe is not working;

需要创建一个 setup.py 文件才能使其工作。 http://www.py2exe.org/index.cgi/Tutorial#Step2;

我遇到了依赖项问题,您必须通过在安装文件中导入包来解决这些问题;

我无法让它与PyQt一起工作。

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

在我看来,这要好得多,因为:

它更易于使用。

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

pyinstaller.exe --onefile MyCode.py

您可以创建单个文件以及其他选项 (https://pyinstaller.readthedocs.io/en/stable/usage.html#options)。

我在使用 PyInstaller 和 multiprocessing 包时只有一个问题,通过使用这个配方解决了这个问题:https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing。

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

【讨论】:

--onefile 标志不会帮助您使其在 Windows 上可移植,因为可执行文件仍希望与必须通过安装的 api-ms-win-crt-runtime-l1-1-0.dll 库(或/和其他)链接vcredist 包。所以依赖仍然存在,必须在运行之前安装。【参考方案6】:

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

【讨论】:

这里是 2019 年 2 月,自 2017 年底以来,pypi 上没有列出 cx_Freeze 版本。这个项目被放弃了吗? 抱歉,我知道我来晚了(2020 年),但不,cx_Freeze 没有被放弃!维护者仍在推送更新,尽管速度要慢得多。【参考方案7】:
pyinstaller yourfile.py -F --onefile

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

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

重要提示 2:不要忘记 --onefile 标志

您可以使用pip install PyInstaller 安装 PyInstaller

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

pyinstaller --hiddenimport win32timezone -F "Backup Program.py"

【讨论】:

【参考方案8】:

我喜欢PyInstaller——尤其是“窗口”变体:

pyinstaller --onefile --windowed myscript.py

它将在一个目录/文件夹中创建一个单独的 *.exe 文件。

【讨论】:

你是否已经在没有 python 的目标机器上尝试过这个?这是如何获得投票的? 你是什么意思,@AbdullahSaid?为什么有人会在没有 Python 的机器上使用 pyinstaller? 我没这么说。我的意思是,如果可执行文件将在没有安装 python 的机器上运行。或者我应该说“客户 PC”,我已经在没有 python 的虚拟机上尝试过它,但它不起作用,你为什么要为自己创建一个安装程序?您的意思是编写它以便其他PC可以在没有任何依赖关系的情况下安装它吗?阅读上面的标题 @AbdullahSaid 目标系统不需要单独安装 Python,它被打包在生成的 exe 文件中。否则这没有多大意义。执行时,exe 文件会将自身解压到它自己的临时文件夹中并从那里获取所有内容!【参考方案9】:

您可能会喜欢py2exe。您还可以在其中找到有关在 Linux 上执行此操作的信息。

【讨论】:

但是你需要给它打包所有选项。 这是如何获得投票的?你是已经尝试过了还是只是根据你的意见说了什么【参考方案10】:

使用 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 文件不再运行。 你可以为 Linux 和 macOS 展示这样的脚本吗?我想从 Windows 为 Linux 和 macOS 创建独立的可执行文件。【参考方案11】:

我还推荐 PyInstaller 以获得更好的向后兼容性,例如 Python 2.3 - 2.7。

对于 py2exe,您必须拥有 Python 2.6。

【讨论】:

pyinstaller 有导入问题。例如:在我的情况下,我在这个目录中 ~/Documents/python101/ 和 ex50_pycomp.py & ex50.py 在这个目录中。 ex50_pycomp.py 导入 ex50.py。我运行 pyinstaller ex50_pycomp.py,我看到所有已编译、生成的 dist。没事吧?我 cd 进入 dist/ex50_pycomp/ 并运行 ex50_pycomp 它可以工作。一旦我将这个 ex50_pycom 放入虚拟机中,就会出现导入错误,在另一个 linux 框中显示“-bash: ./ex_50_pycom: cannot execute binary file: Exec format error” prob1:我使用的是 python2.7,但 pyinstaller 正在与 python3 python3 setup.py build python3 setup.py install 你的 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--【参考方案12】:

对于 Python 3.2 脚本,唯一的选择是 cx_Freeze。从源头构建它;否则将无法正常工作。

对于 Python 2.x,我建议使用 PyInstaller,因为它可以将 Python 程序打包到单个可执行文件中,这与 cx_Freeze 不同,它还输出库。

【讨论】:

【参考方案13】:

py2exe 会生成您想要的 EXE 文件,但您需要在要使用新 EXE 文件的机器上安装相同版本的 MSVCR90.dll。

请参阅 Tutorial 了解更多信息。

【讨论】:

【参考方案14】:

您可以在 Distribution Utilities 找到列出的分发实用程序列表。

我使用bbfreeze,它运行良好(但还支持 Python 3)。

【讨论】:

***.com/questions/33683133/… 我用的是 bbfreeze 非常不错的包。 它会处理依赖关系并安装相关的py模块吗? @Volatil3 是的,所有的依赖关系都得到了处理。 WRT 在主机系统上安装模块 - 有不同类型的编译。 bbfreeze 会将所有内容编译成多个.so 文件,或直接复制 .egg 文件,它们都应存在于单个目录中(或作为单个文件)。无需安装。【参考方案15】:

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

$ python -m pip install -r requirements.txt --target myapp
$ python -m zipapp -p "interpreter" myapp

其中interpreter 可以是/usr/bin/env python 之类的东西(请参阅Specifying the Interpreter)。

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

如果您不想要求最终用户安装 Python,您可以将应用程序与 the embeddable Python package 一起分发。

【讨论】:

【参考方案16】:

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

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

【讨论】:

今天看来它已经死了。【参考方案17】:

使用PyInstaller,我找到了一个更好的方法,使用.exe 的快捷方式而不是使用--onefile。无论如何,周围可能有一些数据文件,如果您正在运行基于站点的应用程序,那么您的程序也依赖于 HTML、javascript 和 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 更好:

    在 onefile 的情况下,Windows 7 操作系统缺少 .dll 存在问题,需要事先安装,等等。打哈欠。使用包含多个文件的通常构建,没有此类问题。 我的 Python 脚本使用的所有文件(它正在部署一个 tornado Web 服务器,并且需要一个完整的网站文件价值!)不需要移动到任何地方:我只需在顶部创建快捷方式。 我实际上可以在Ubuntu(运行python3 myfile.py)和Windows(双击快捷方式)上使用这个完全相同的文件夹。 我不需要为过于复杂的 .spec 文件破解来包含数据文件等而烦恼。

哦,记得在构建后删除构建文件夹。它会节省大小。

【讨论】:

嗨,刚刚更新.. 我决定放弃 UPX 压缩并最终采用 --onefile 方式。必须选择一个,因为 UPX 目前在压缩特定 DLL 时存在错误。【参考方案18】:

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

另一种可能是,在 C 中制作核心函数(您希望难以反转的那些),编译它们并使用 Boost.Python 导入编译后的代码(另外,您可以获得更快的代码执行速度)。然后使用提到的任何工具进行分发。

【讨论】:

【参考方案19】:

我听说PyRun 也是一个选项。目前支持 Linux、FreeBSD 和 Mac OS X。

【讨论】:

欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.

以上是关于如何使 Python 脚本独立可执行以在没有任何依赖项的情况下运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建之前使CMake运行python脚本,以便为我的项目生成文件以在构建中使用?

如何安装 pyspark 以在独立脚本中使用?

python制作一键启动脚本

如何关闭脚本调试?

如何让 python 脚本作为可执行文件运行? [复制]

linux可执行文件不工作,但脚本在python中工作