1. 模块选择与确认
首先确定要静态编译进Python的模块,例如需要将asyncio模块静态编译到python3。可以通过查看Modules/Setup
文件来了解详细的官方库编译项。
2. 清理源码目录
执行以下命令将源码目录恢复到初始状态:
make distclean
3. 配置 Modules/Setup.local
将需要静态编译的模块信息写入Modules/Setup.local
文件,例如:
*static*
_asyncio _asynciomodule.c
_socket socketmodule.c
math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE
select selectmodule.c
array arraymodule.c
_posixsubprocess _posixsubprocess.c
_contextvars _contextvarsmodule.c
_struct _struct.c
binascii binascii.c
4. 执行 configure
运行以下命令进行配置,确保环境中没有缺少编译依赖:
./configure LDFLAGS="-static" --disable-shared
如果Modules/Setup.local
被修改或覆盖,请重新写入该文件并再次执行此步骤。若仍存在问题,可检查configure过程中的报错信息。
5. 编译 Python3 程序
根据实际情况进行多线程编译:
make -j10 LDFLAGS="-static" LINKFORSHARED=" "
6. 测试运行与静态链接验证
在当前目录直接测试运行程序,确保没有缺失模块:
ldd ./python # 查看执行文件是否为静态编译
./python xxxx.py
7. 打包 Python3 程序
将编译好的Python3程序打包到目标环境中:
pwd
/root/0616/Python-3.9.23
make install LDFLAGS="-static" LINKFORSHARED=" " DESTDIR=/root/0616/Python-3.9.23/1
8. 部署与复制
将打包好的文件部署到目标环境:
ls /root/0616/Python-3.9.23/2/usr/local/lib/
libpython3.9.a pkgconfig python3.9
rsync -avP /root/0616/Python-3.9.23/2/usr/local/ root@new:/usr/local/
ln -sv /usr/local/bin/python3-static /usr/bin/python3
简化部署方案
更简单的做法是只复制静态编译后的Python文件和相关依赖库到目标环境:
cp ./python3.9.static /target/path/
cp /root/0616/Python-3.9.23/2/usr/local/lib/python3.9 /target/path/
这样,程序就可以在几乎任何发行版上零依赖运行。