如何将Python脚本“编译”成无需安装Python的PC可用形式?

33 投票
5 回答
55671 浏览
提问于 2025-04-16 06:55

我有一个Python脚本:

myscript.py

我这样来执行它:

python D:\myscript.py

不过,为了让这个运行成功,我必须在我的电脑上安装Python,并且要把它放在PATH环境变量里。

有没有办法把Python的可执行文件和这个Python脚本“打包”在一起,这样其他人就可以在他们的电脑上运行这个脚本,而不需要安装Python?

如果只在Windows上能运行就可以。

编辑:

我尝试了compile.py,但是出现了这个错误:

Traceback (most recent call last):
  File "D:\stuff\compile.py", line 4, in <module>
    import py2exe
ImportError: No module named py2exe

5 个回答

11

你想要的东西类似于 py2exe

13

PyInstaller 对我来说效果很好,它能生成相对较小的程序包,因为它使用了 upx。它的依赖检测比当时的 py2exe 更好。不过,它似乎最近没有太多更新,可能不支持 3.x 版本。

在代码库中的源代码比 1.4 版本的包更适合入手。

还可以查看关于 Python 2.6+ 的维基页面。

以下是一些功能列表:

  • 可以把 Python 程序打包成标准的可执行文件,这样在没有安装 Python 的电脑上也能运行。
  • 支持多平台:可以在 Windows(32位和64位)、Linux(32位和64位)和 Mac OS X(目前只支持32位)上运行。
  • 支持多个版本:可以在任何版本的 Python 上运行,从 1.5 到 2.7。注意:如果你在 Windows 上使用 Python 2.6+,请查看 Python26Win。
  • 灵活的打包模式:
  • 单目录:构建一个包含可执行文件和程序使用的所有外部二进制模块(.dll, .pyd, .so)的目录。
  • 单文件:构建一个完全自包含的可执行文件,运行时不需要任何外部依赖。
  • 自定义:你可以通过一个简单的 Python 脚本自动化 PyInstaller,做你想要的任何打包模式。
  • 对许多第三方包提供明确的智能支持(比如隐藏导入、外部数据文件等),让它们能直接与 PyInstaller 配合使用(见 SupportedPackages)。
  • 完全支持单文件 EGG:所需的 .egg 文件会自动检查依赖关系并打包,所有与 egg 相关的功能在运行时也能支持(入口点等)。
  • 部分目录 EGG 支持:所需的 .egg 目录会自动检查依赖关系并打包,但 egg 特有的功能在运行时无法使用。
  • 自动支持通过 ctypes 使用的二进制库(详细信息见 CtypesDependencySupport)。
  • 支持通过知名的 UPX 压缩工具进行自动二进制打包。
  • 可选的控制台模式(在运行时查看标准输出和标准错误)。
  • Windows 特有功能:
  • 支持对可执行文件进行代码签名。
  • 完全自动支持 CRTs:不需要手动分发 MSVCR*.DLL、重分发安装程序、清单或其他任何东西;真正的一文件应用程序,随处可用!
  • 可选择的可执行文件图标。
  • 可完全配置的版本资源部分和可执行文件中的清单。
  • 支持构建 COM 服务器。
  • Mac 特有功能:
  • 初步支持捆绑(见 MacOsCompatibility)。
29

这里有一种方法可以做到这一点(适用于Windows,使用 py2exe)。

首先,在你的Windows电脑上安装 py2exe

然后创建一个名为 compile.py 的Python脚本,内容如下:

import sys
from distutils.core import setup
import py2exe

entry_point = sys.argv[1]
sys.argv.pop()
sys.argv.append('py2exe')
sys.argv.append('-q')

opts = {
    'py2exe': {
        'compressed': 1,
        'optimize': 2,
        'bundle_files': 1
    }
}

setup(console=[entry_point], options=opts, zipfile=None)

要将你的Python脚本编译成Windows可执行文件,运行这个脚本,并把你的程序作为参数传入:

$ python compile.py myscript.py

这样就会生成一个包含Python解释器的可执行文件(EXE)。你可以直接分发这个可执行文件。

撰写回答