静态编译 Python3 程序指南

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/

这样,程序就可以在几乎任何发行版上零依赖运行。

发表回复