寻找PyInstaller替代方案:将Python代码编译为Linux可执行文件/库
可行替代方案
针对你的需求,以下是几个无需PyInstaller的实现方案,均能满足转C、编译、跨Linux调用及提速的要求:
方案1:Cython
Cython是将Python代码转换为C扩展的主流工具,能直接处理numpy这类依赖,编译后的代码执行效率显著提升,还能生成可调用的库或独立可执行文件。
步骤:
- 安装Cython和编译依赖
pip install cython sudo apt-get install gcc python3-dev # Debian/Ubuntu系,其他Linux发行版对应安装gcc和Python开发包
- 将你的Python代码保存为
print_hi.pyx(Cython源文件),内容不变:
import numpy as np def print_hi(name): arr = np.zeros(9) print(arr) print(f'Hi, {name}') if __name__ == '__main__': print_hi('Compiled Python')
- 编写
setup.py用于编译:
from setuptools import setup from Cython.Build import cythonize import numpy as np setup( ext_modules=cythonize("print_hi.pyx"), include_dirs=[np.get_include()] # 引入numpy的头文件路径 )
- 编译生成库或可执行文件:
- 生成共享库(可被Python或C程序调用):
python setup.py build_ext --inplace
编译完成后会生成print_hi.c(转换后的C代码)和print_hi.*.so(Linux下的共享库)。你可以在Python中直接import调用,也能通过C语言的dlopen加载调用。
- 生成独立可执行文件:
如果需要直接运行的可执行文件,可先生成带main函数的C代码再手动编译:
cython --embed print_hi.pyx gcc -o print_hi print_hi.c $(python3-config --cflags --ldflags) -I$(python3 -c "import numpy; print(numpy.get_include())")
生成的print_hi就是可直接运行的Linux可执行文件,包含所有依赖的编译后的机器码。
优势:
- 完全转换为C代码,执行速度比原生Python快数倍(尤其是循环密集型代码)
- 生成的共享库可跨Linux环境调用(只要系统架构一致)
- 完美支持numpy等第三方依赖
方案2:Nuitka
Nuitka是将Python代码编译为C代码后再编译为机器码的工具,无需手动修改代码,直接处理原生Python代码,生成的可执行文件独立且运行速度快。
步骤:
- 安装Nuitka
pip install nuitka
- 编译你的Python代码:
python -m nuitka --standalone --onefile print_hi.py
--standalone:生成包含所有依赖的独立包--onefile:将所有内容打包为单个可执行文件(可选,不加则生成一个目录)
编译完成后会生成print_hi.bin(单个可执行文件)或print_hi.dist目录,直接运行即可:
./print_hi.bin
优势:
- 无需修改原生Python代码,直接编译
- 生成的可执行文件可在同架构的任意Linux环境运行(无需安装Python)
- 执行速度接近C程序,尤其是对循环和计算密集型代码优化明显
方案3:PyPy(补充方案)
如果你更侧重运行速度而非显式生成C代码,PyPy的JIT编译能大幅提升Python代码的执行效率,也能便捷运行代码:
步骤:
- 安装PyPy
sudo apt-get install pypy3 # Debian/Ubuntu系
- 直接运行代码:
pypy3 print_hi.py
注意:
PyPy对numpy的支持需要安装pypy3-numpy,多数常规numpy操作都能完美兼容,你的示例代码无任何问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

