如何将Python脚本编译为二进制可执行文件

144
我需要将一个Python脚本转换成Windows可执行文件。
我已经安装了Python 2.6,路径为python26
我创建了一个脚本并将其保存在C:\pythonscript中。该文件夹中有两个文件: setup.pyoldlogs.py(需要转换的文件)。 setup.py的代码如下:
from distutils.core import setup
import py2exe

setup(console=['oldlogs.py'])

我怎样才能将 oldlogs.py 转换成一个 exe 文件?


1
请查看它的教程:教程链接 - Ashwini Chaudhary
为了完整性,cx_Freeze 是另一个可以用来完成这个任务的工具(除了已经提到的 PyInstaller 和 py2exe)。 - Thomas K
4
可能是 如何使 Python 脚本独立可执行,无需任何依赖项? 的重复问题。 - Cees Timmerman
4个回答

79

或者使用PyInstaller作为py2exe的替代方案。这是一个不错的起点。PyInstaller也允许您为Linux和Mac创建可执行文件......

以下是如何相当轻松地使用PyInstaller来解决手头的问题:

pyinstaller oldlogs.py

根据该工具的文档:

PyInstaller分析myscript.py并执行以下操作:

  • 在与脚本相同的文件夹中编写myscript.spec。
  • 如果不存在,创建与脚本相同的文件夹内build文件夹。
  • 在build文件夹中编写一些日志文件和工作文件。
  • 如果不存在,创建与脚本相同的文件夹内dist文件夹。
  • 在dist文件夹中编写名为myscript可执行文件夹。

在dist文件夹中,您可以找到捆绑的应用程序,并将其分发给用户。


9
cx_Freeze更好,它甚至支持Python 3.3。 - Ashwini Chaudhary
嘿,这甚至可以在wine上运行,至少支持Windows XP的Python 3.4版本。真是太棒了!我在我的Fedora Linux机器上使用winepython 3.4pip-Win(只需按照pyinstaller网站上的安装说明进行操作)创建了一个Windows可执行文件。 - erik
3
你认为 cx_FreezePyInstaller 更好的原因是什么? - alpha_989
请注意,与PyInstaller相比,“cx_Freeze不支持构建单个文件exe,其中您的应用程序的所有库都嵌入在一个可执行文件中。” https://cx-freeze.readthedocs.io/en/latest/faq.html#single-file-executables - Taylor D. Edmiston

16

我推荐使用PyInstaller,使用以下命令可以将简单的Python脚本转换为exe:

utils/Makespec.py [--onefile] oldlogs.py

该命令会创建一个名为yourprogram.spec的文件,用于配置最终可执行文件的构建。接下来的命令将根据配置文件构建可执行文件:

utils/Build.py oldlogs.spec

更多信息可以在这里找到。


10

既然其他的 Stack Overflow 答案链接到这个问题,值得注意的是现在有另一个选项: PyOxidizer

这是一个 rust 工具,它以某些方式类似于 pyinstaller,但有一些额外的功能详细说明 在此处,总结一下关键点:

  • 默认情况下所有包的单个二进制文件具有将模块零拷贝加载到内存中的能力,与 pyinstaller 提取它们到临时目录相反当使用onefile模式时
  • 能够生成静态链接二进制文件

pyoxidizer的另一个优点是,如果您在具有比目标系统更新的 glibc 版本的系统上创建二进制文件,则不会出现可以在 pyinstaller 中出现的GLIBC_X.XX not found问题)。

总体而言,pyinstaller 比 PyOxidizer 更简单易用,后者通常需要在配置文件中添加一些复杂性,并且它不太 Pythonic,因为它是用 Rust 编写的,并使用 Python 世界不太熟悉的配置文件格式,但如果您想要生成单个二进制文件(这不是 pyinstaller 的默认设置),则 PyOxidizer 做了一些更高级的东西。


2
我还推荐PyOxidizer,它是跨平台的、零拷贝策略和现代化的。请访问https://pyoxidizer.readthedocs.io/en/stable/pyoxidizer_comparisons.html了解与其他工具的比较详情。 - Donghua Liu

-2
# -*- mode: python -*-

block_cipher = None

a = Analysis(['SCRIPT.py'],
             pathex=[
                 'folder path',
                 'C:\\Windows\\WinSxS\\x86_microsoft-windows-m..namespace-downlevel_31bf3856ad364e35_10.0.17134.1_none_50c6cb8431e7428f',
                 'C:\\Windows\\WinSxS\\x86_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 )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接