如何将 Python 脚本编译为二进制可执行文件
- 2025-03-04 08:24:00
- admin 原创
- 76
问题描述:
我需要将 Python 脚本转换为 Windows 可执行文件。
我已经安装了 Python 2.6 python26
。
我创建了一个脚本并将其保存在C:pythonscript
。此文件夹中有两个文件
Setup.py
和oldlogs.py
(此文件需要转换)
setup.py
代码是
from distutils.core import setup
import py2exe
setup(console=['oldlogs.py'])
如何将 oldlogs.py 转换为 exe 文件?
解决方案 1:
或者使用PyInstaller作为py2exe的替代品。这是一个很好的起点。PyInstaller 还允许您为 Linux 和 Mac 创建可执行文件...
以下是如何轻松使用 PyInstaller 解决当前问题的方法:
pyinstaller oldlogs.py
来自该工具的文档:
PyInstaller 分析 myscript.py 并:
将 myscript.spec 写入与脚本相同的文件夹中。
如果不存在,则在与脚本相同的文件夹中创建一个文件夹。
在构建文件夹中写入一些日志文件和工作文件。
如果不存在文件夹 dist,则在与脚本相同的文件夹中创建一个文件夹。
将 myscript 可执行文件夹写入 dist 文件夹。
在 dist 文件夹中,您可以找到分发给用户的捆绑应用程序。
解决方案 2:
我推荐PyInstaller,可以使用以下命令将简单的 python 脚本转换为 exe:
utils/Makespec.py [--onefile] oldlogs.py
它将创建一个 yourprogram.spec 文件,该文件是用于构建最终 exe 的配置。下一个命令将从配置文件构建 exe:
utils/Build.py oldlogs.spec
更多内容请点击此处
解决方案 3:
由于其他 SO 答案链接到这个问题,因此值得注意的是PyOxidizer现在还有另一种选择。
它是一个 rust 实用程序,其工作方式与 pyinstaller 相同,但是它还有一些附加功能,详见这里,总结一下主要功能:
默认情况下,所有软件包都采用单一二进制文件,能够将模块零拷贝加载到内存中,而使用 pyinstaller
onefile
模式时,则需要将它们提取到临时目录中能够生成静态链接二进制文件
(另一个优点是,如果你在比目标系统更新的 glibc 版本上创建二进制文件,pyoxidizer
它似乎不会受到pyinstaller 可能出现的问题的影响)。GLIBC_X.XX not found
总体而言,pyinstaller 比 PyOxidizer 更易于使用,后者通常需要在配置文件中添加一些复杂性,而且由于它是用 Rust 编写的,并且使用了 Python 世界中不太熟悉的配置文件格式,因此它的 Python 风格不太明显,但 PyOxidizer 可以做一些更高级的事情,特别是当你希望生成单个二进制文件时(这不是 pyinstaller 的默认设置)。
解决方案 4:
您可以使用 pyinstaller 来发布python脚本的单个二进制文件。
pyinstaller script.py --onefile
它发布包含单个二进制可执行文件的 dist 文件夹。
解决方案 5:
可以使用nuitka python 包,可以方便地从 PyPi 下载到 python 环境中:
pip install nuitka
注意:该软件包支持python 2.6-2.7,以及大多数python 3版本:3.4-3.12。
使用 Nuitka
<the_right_python> -m nuitka [options] <file_to_compile>
免责声明:Nuitka 创建可在任何具有相同操作系统的机器上运行的独立可执行文件(例如,Windows 到 Windows)。但是,在一个操作系统(例如 Windows)上编译的可执行文件将无法在另一个操作系统(例如 macOS)上运行。不支持针对不同操作系统进行交叉编译。
在运行时提供的众多选项中,最值得注意的是以下两个选项:
--standalone:允许可执行文件在不依赖其他机器的 Python 安装的情况下进行分发。这将创建一个新的分发文件夹,该文件夹必须与其他机器上的可执行文件一起发布;因为它包含源 Python 程序依赖项(例如 .dll 和 .pyd 文件)的高效、编译形式,因此该文件夹在生产设置中可能会变得非常大。
--onefile:创建一个分发文件夹,但会创建并使用压缩的可执行文件。如文档中所述:
--onefile 确实会创建一个文件,但在转向它之前,请确保独立文件能够正常工作,因为它只会使调试更加困难,例如在缺少数据文件的情况下。
项目选项:下面的示例展示了一种在正在编译的 Python 脚本中自定义运行时选项的巧妙方法。
# Compilation mode, support OS-specific options
# nuitka-project-if: {OS} in ("Windows", "Linux", "Darwin", "FreeBSD"):
# nuitka-project: --onefile
# nuitka-project-else:
# nuitka-project: --standalone
# The PySide6 plugin covers qt-plugins
# nuitka-project: --enable-plugin=pyside6
# nuitka-project: --include-qt-plugins=qml
项目选项中支持的一些变量包括:
解决方案 6:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['SCRIPT.py'],
pathex=[
'folder path',
'C:\\Windows\\WinSxS\_microsoft-windows-m..namespace-downlevel_31bf3856ad364e35_10.0.17134.1_none_50c6cb8431e7428f',
'C:\\Windows\\WinSxS\_microsoft-windows-m..namespace-downlevel_31bf3856ad364e35_10.0.17134.1_none_c4f50889467f081d'
],
binaries=[(''C:\\Users\\chromedriver.exe'')],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='NAME OF YOUR EXE',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
扫码咨询,免费领取项目管理大礼包!