• #Linux杂记--将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 distutils.core import setup
    from Cython.Build import cythonize
    
    setup(ext_modules=cythonize(['test.py'], compiler_directives={"language_level": "3"}))
    
    • 1
    • 2
    • 3
    • 4

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

    def say_hello():
    	print('hello')
    
    • 1
    • 2

            3.在终端中运行命令:

    python3 setup.py build_ext
    
    • 1

            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()"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    交叉编译方法

            上述方法只能生成本机操作系统和处理器架构下的 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

            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
    
    • 1
    • 2
    • 3

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

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

            4.构建交叉编译环境

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

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

  • 相关阅读:
    Python的logging用法(日志记录工具)
    C语言-自定义类型结构体详细讲解
    基于物联网的教室人数检测系统-设计说明书
    mybatis的动态sql知识总结
    3-Mask-RCNN理解
    (文献随笔)肿瘤浸润的活化B细胞抑制结直肠癌的肝转移(Cell Report, 2022年8月30日)
    Codeforces Round 958 (Div. 2)[部分题解ABC]
    持续集成部署 - GitLab中 WebHook 的基础使用
    SpringBoot打包部署最佳实践
    PixelSNAIL论文代码学习(1)——总体框架和平移实现因果卷积
  • 原文地址:https://blog.csdn.net/qq_43519779/article/details/134259997