type
Post
status
Published
date
Apr 3, 2025
summary
slug
tags
推荐
Python
实用教程
工具
计算机
category
技术分享
icon
password
在 Python 中,将脚本(
.py 文件)转换为可执行文件(.exe 适用于 Windows,或二进制文件适用于 macOS/Linux)可以使用多种工具。以下是几种常见的方法:方法 1:使用 PyInstaller(推荐)
PyInstaller 是一个流行的工具,可以将 Python 脚本打包成独立的可执行文件,支持 Windows、macOS 和 Linux。安装 PyInstaller
打包 Python 脚本
-onefile:打包成单个.exe文件(否则会生成多个依赖文件)。
-windowed:隐藏命令行窗口(适用于 GUI 程序)。
your_script.py:你的 Python 脚本文件名。
输出文件位置
- 打包完成后,可执行文件默认在
dist/目录下。
方法 2:使用 auto-py-to-exe(GUI 版 PyInstaller)
如果你更喜欢图形界面,可以使用
auto-py-to-exe。安装
运行
然后按照 GUI 界面选择 Python 脚本、输出方式(单文件/多文件)、是否隐藏控制台等。
方法 3:使用 cx_Freeze
cx_Freeze 是另一个打包工具,适用于 Windows、macOS 和 Linux。安装
创建 setup.py
打包
- 输出文件在
build/目录下。
方法 4:使用 Nuitka(编译为 C 代码)
Nuitka 可以将 Python 代码编译成 C 代码,再编译成可执行文件,性能更好。安装
打包
-standalone:生成独立可执行文件。
-onefile:打包成单个文件(可选)。
注意事项
- 依赖问题:
- 如果脚本依赖第三方库(如
requests、numpy),PyInstaller 会自动打包它们。 - 如果某些库未被正确打包,可以手动添加
-add-data选项。
- 文件路径问题:
- 打包后,脚本的工作目录可能改变,建议使用
os.path.dirname(__file__)获取当前路径。
- 反编译风险:
.exe文件仍然可以被反编译,如需保护代码,可考虑混淆或使用Nuitka编译。
- 使用nuitka打包后,提示INTEL oneMKL ERROR: 找不到指定的模块。
- 手动复制 MKL DLL 文件
如果仍然需要 MKL,可以手动将缺失的 DLL 文件复制到打包目录:
- 找到 MKL DLL 文件:
- 进入 Python 安装目录(如
C:\Python39\Lib\site-packages\numpy\.libs或C:\Users\YourName\AppData\Local\Programs\Python\Python39\Lib\site-packages\numpy\.libs)。 - 查找
mkl_intel_thread.2.dll和其他相关文件(如mkl_core.2.dll、mkl_def.2.dll)。
- 复制到 Nuitka 输出目录:
- 打包后,Nuitka 会生成一个
your_script.dist文件夹(如果使用-standalone)。 - 将缺失的 DLL 文件复制到该目录。
总结
工具 | 特点 | 适用平台 |
PyInstaller | 简单易用,支持单文件打包 | Windows, macOS, Linux |
auto-py-to-exe | PyInstaller 的 GUI 版本 | Windows, macOS, Linux |
cx_Freeze | 适用于复杂项目 | Windows, macOS, Linux |
Nuitka | 编译为 C 代码,性能更好 | Windows, macOS, Linux |
推荐:
- 新手 →
PyInstaller或auto-py-to-exe
- 高级用户 →
Nuitka(性能优化)
- 作者:红尘客
- 链接:https://notion.hhymc.top:18443/article/1caa9a09-ba30-804c-9ae9-c8205544336e
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



.jpg?t=34da9a09-ba30-80c5-b508-dac3cb7dc93f)
.jpg?t=366a9a09-ba30-8038-ba3b-ce59ff59cde4)
.jpg?t=35aa9a09-ba30-808b-97e7-d6a1d42e9119)
.jpg?t=351a9a09-ba30-8058-8523-ff170f9fe536)