#Python杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法

#Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法

引言

        众所周知,Python 是跨平台的解释性语言,我们可以将 Python 源码文件不做任何修改的移动到其他平台上运行。但如果在某些情况下我们仅需要在某个平台上运行,那么就可以考虑将 Python 源码文件编译为 .so 文件,因为这可以带来以下好处:

  • 源码保护:.so文件本身不具有可读性且可以被加密,因此可以防止源码被泄露。这可以保护Python代码的知识产权。
  • 代码重用:.so文件可以被其他语言的程序调用,因此可以方便地将Python代码部署到其他语言的环境中。这可以提高代码的复用性和可移植性。
  • 性能提升:由于.so文件是动态链接库,因此可以直接加载到内存中,而不需要先将Python解释器加载到内存中,因此可以提高程序的运行速度。根据测试,将Python源码编译为.so文件后,程序的运行速度可以提高10%~20%。
  • 文件大小减小:.so文件只包含Python代码的字节码,而不需要包含Python解释器,因此文件大小通常要比Python源文件小很多。这可以方便地将Python代码部署到嵌入式设备等资源受限的环境中。

正文

        1.编写一个 setup.py 文件,内容如下:

from setuptools import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize(['test.py'], compiler_directives={"language_level": "3"}))

        2.编写 test.py 文件,示例如下:

def say_hello():
	print('hello')

        3.在终端中运行命令:

python3 setup.py build_ext

        4.目录中会出现 test.c 文件以及 build 文件夹,其中 test.c 文件就是 test.py 的 C 语言实现,build/lib.xxx 里的就是我们需要的 .so 文件了,将 build 中的 .so 文件移出即可使用:

# 删除当前的 test.py 文件
rm test.py
# 不同平台的路径不一样,读者自行查看
cp build/lib.macosx-14.0-arm64-cpython-311/test.cpython-311-darwin.so .
# 测试结果,有 hello 输出表示成功
python3 -c "import test;test.say_hello()"

交叉编译方法

        上述方法只能生成本机操作系统和处理器架构下的 so 文件,如果想要生成其它平台和处理器架构的 so 文件,就需要使用交叉编译,笔者在此记录一下实现方法。
        注:笔者使用的是 ubuntu 22.04 处理器架构为 aarch64,想要生成 ubuntu 22.04 处理器架构为 x86_64 的 so 文件。

        1.安装相关依赖:

sudo aptitude update
sudo aptitude install wget make unzip file gawk gcc g++ autoconf flex texinfo help2man patch libncurses5-dev

wget https://mirror.easyname.at/gnu/libtool/libtool-2.4.7.tar.gz
tar -xzvf libtool-2.4.7.tar.gz
cd libtool-2.4.7
./configure
make
sudo make install

wget https://mirror.easyname.at/gnu/bison/bison-3.8.2.tar.gz
tar -xzvf bison-3.8.2.tar.gz 
cd bison-3.8.2
./configure 
make
sudo make install

        2.下载并解压交叉编译工具:

wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.xz
xz -d crosstool-ng-1.26.0.tar.xz
tar -xvf crosstool-ng-1.26.0.tar

        3.安装,最好一步一步运行,每一步都需要读者注意检查一下是否有错,因为有可能会缺失某些依赖,需要读者手动安装一下:

# 每一步都需要读者注意检查一下是否有错
./bootstrap
./configure
make
sudo make install

        4.构建交叉编译环境

# 查看所有支持的目标平台列表
ct-ng list-samples
# 选择目标平台列表
ct-ng x86_64-ubuntu16.04-linux-gnu
# 构建交叉编译工具
ct-ng build

        5.在主目录中就会发现名为 x-tools 的文件夹,里面就包含了目标平台的编译工具,直接使用即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值