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

news/2024/11/2 4:36:42/

#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 cythonizesetup(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-devwget 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 installwget 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 的文件夹,里面就包含了目标平台的编译工具,直接使用即可。


http://www.ppmy.cn/news/1209287.html

相关文章

使用iperf3在macOS上进行网络性能测试

iperf3是一个用于测量网络性能的工具,它可以帮助你了解两台服务器之间的带宽和延迟。本博客将指导你在macOS上安装iperf3,并展示如何连接服务器进行网络性能测试。 步骤1:安装Homebrew 如果你尚未安装Homebrew,可以通过以下步骤…

前端-第一部分-HTML

一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language,翻译为超文本标签语言,标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一,也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…

OpenTiny Vue 组件库支持 Vue2.7 啦!

之前 OpenTiny 发布了一篇 Vue2 升级 Vue3 的文章。 🖖少年,该升级 Vue3 了! 里面提到使用了 ElementUI 的 Vue2 项目,可以通过 TinyVue 和 gogocode 快速升级到 Vue3 项目。 有朋友评论替换button出错了,并且贴出了…

Lambda表达式的基本使用

引入 Lambda表达式是Java 8引入的一项重要特性,它允许我们以更简洁的方式编写匿名函数。在讨论Lambda表达式之前,让我们首先回顾一下匿名内部类存在的问题。 匿名内部类存在的问题 在Java 8之前,我们通常使用匿名内部类来传递行为。例如&a…

git 简单使用说明

git 是什么? 官方的说法自己去官网查,我只说说我浅薄的看法:git是一款用来协同敲代码的工具,方便一群人一起敲代码。 安装 自己去官网下载,b站也是一堆视频 使用前的准备 1.github新建仓库 当然码云也可以&#x…

【学术综述】-如何写出一篇好综述-写好综述要注意的问题

文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why?3 做了什么【做了哪些方面的survey】?4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的,花了一天的时间在读这篇surve…

10. GPIO中断

10. GPIO中断 回顾stm32中断系统STM32中断向量表中断向量偏移NVIC中断控制器 Cortex_A7 中断系统中断向量表GIC控制器中断IDGIC逻辑分块CP15协处理器c0寄存器c1寄存器c12寄存器c15寄存器 中断使能中断优先级设置优先级数配置 GICC_PMR抢占优先级和子优先级位数设置 GICC_BPR优先…

单页面应用与多页面应用的区别?

单页面应用(SPA)与多页面应用(MPA)的主要区别在于页面数量和页面跳转方式。单页面应用只有一个主页,而多页面应用包含多个页面。 单页面应用的优点有: 用户体验好:内容的改变不需要重新加载整…