无需PyInstaller/Py2exe编译Python程序及制作独立运行程序的方法
问题解答
1. 不使用PyInstaller或Py2exe编译Python程序的方法
方法一:用Cython转译并编译为原生二进制
Cython能将Python代码转译为C代码,再编译成可执行文件,还能提升部分代码的运行速度(转为原生机器码执行)。操作步骤:
- 安装Cython:
pip install cython - 针对目标Python脚本(如
test.py),生成对应的C代码:cython --embed test.py - 用C编译器(MinGW或MSVC)编译生成的C文件,链接Python库:
- Windows下MinGW命令示例:
gcc -I"你的Python安装路径\include" -L"你的Python安装路径\libs" test.c -lpython39 -o test.exe
- Windows下MinGW命令示例:
方法二:使用Nuitka编译
Nuitka是将Python代码转译为C++后编译成原生可执行文件的工具,并非打包工具,能直接提升运行效率,且支持生成独立程序:
- 安装Nuitka:
pip install nuitka - 生成独立exe:
生成目录中的python -m nuitka --standalone --windows-disable-console test.py.exe文件可独立运行,无需额外携带Python环境。
方法三:使用cx_Freeze打包
cx_Freeze是另一种打包工具,原理类似PyInstaller但不在禁用列表内,操作步骤:
- 安装cx_Freeze:
pip install cx_Freeze - 编写
setup.py:from cx_Freeze import setup, Executable target = Executable(script="test.py", base=None) setup( name="MyApp", version="1.0", description="My Python application", executables=[target] ) - 执行打包命令:
生成的python setup.py buildbuild目录下会包含可执行文件和对应依赖库。
2. 自制可运行Python脚本的独立程序(类似PyInstaller功能)
你之前的代码依赖Python DLL,是因为默认Python为动态链接版本。要制作独立程序,需静态编译Python解释器并将脚本嵌入程序中,步骤如下:
步骤1:编译Python静态库
默认Python安装包是动态链接版本,需自行编译静态库:
- Windows(MSVC):
- 下载Python源码并解压,打开VS命令提示符
- 执行编译命令:
编译完成后会得到静态库.\configure --enable-shared=no nmakepythonXX.lib(XX为版本号)和头文件。
- Linux(GCC):
- 下载源码解压后执行:
得到静态库./configure --enable-shared=no makelibpythonXX.a。
- 下载源码解压后执行:
步骤2:将Python脚本嵌入C程序
可直接将脚本内容写为字符串常量(适合短脚本),或把脚本作为资源嵌入程序:
#include <Python.h> int main(int argc, char **argv) { // 设置程序名称,辅助Python定位资源 Py_SetProgramName(argv[0]); // 初始化Python解释器 Py_Initialize(); // 嵌入Python脚本内容,支持多行字符串 const char* script_content = R"( print('Hello from embedded Python script!') # 这里可添加你的业务逻辑代码 )"; // 执行脚本并判断是否出错 if (PyRun_SimpleString(script_content) != 0) { printf("Script execution failed\n"); } // 清理Python解释器 Py_Finalize(); return 0; }
步骤3:编译C程序为独立exe
用C编译器链接静态Python库,生成独立可执行文件:
- Windows(MSVC):
cl /I"Python源码目录\Include" main.c "Python编译目录\PCbuild\amd64\python39.lib" /link /OUT:embedded_app.exe - Linux(GCC):
gcc -I"Python源码目录/include" main.c "Python编译目录/libpython39.a" -o embedded_app -lpthread -ldl -lutil
生成的embedded_app.exe(Linux下为可执行文件)可独立运行,无需携带Python DLL或脚本文件。
处理第三方依赖
若脚本用到第三方库(如numpy),可通过两种方式处理:
- 用Cython将第三方库代码编译为静态链接模块,并入主程序
- 将第三方库的安装目录打包到程序目录,在C程序中通过
PySys_SetPath添加库路径
内容的提问来源于stack exchange,提问作者Matyn
相关产品推荐
相关产品推荐

