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

news/2024/2/28 18:16:56

#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)的主要区别在于页面数量和页面跳转方式。单页面应用只有一个主页,而多页面应用包含多个页面。 单页面应用的优点有: 用户体验好:内容的改变不需要重新加载整…

三季度净利润高达28.1亿元,2023的理想“高开高走”?

最近,理想汽车的好消息接二连三,先是月交付量突破四万辆大关。紧接着11月9日发布的2023年第三季度财报显示,理想汽车实现第三季度营收346.8亿人民币,同比增长271.2%。 今年以来,理想汽车的整体走势可谓“高开高走”。…

汇编-EQU伪指令(数值替换)

EQU伪指令将一个符号名称与一个整数表达式或一个任意文本相关联, 它有3种格式 在第一种格式中, expression必须是一个有效的整数表达式。在第二种格式中, symbol是一个已存在的符号名称, 已经用或EQU定义过。在第三种格式中&…

skynet学习笔记02— skynet介绍、skynet基础API与环境变量

01、Skynet与Actor模型 在系统Skynet之前,先了解一下Skynet与Actor模型,下列是风云大佬的介绍以及一个大佬的博客 https://github.com/cloudwu/skynet/wiki/GettingStartedhttps://blog.csdn.net/qq769651718/article/details/79432793 02、Skynet基础…

ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境

一、前期安装 1、安装ncurses库(已经包含了,其他的os需要安装) sudo apt install libncurses5二、安装 sudo ./xsetup使用lic进行激活。 三、安装后 输入指令 sudo gedit ~/.bashrc 末尾添加 source /opt/Xilinx/Vivado/2019.1/setti…

使用easyui前端框架快速构建一个crud应用

本篇文章将会详细介绍jquery easyui前端框架的使用,通过创建一个crud应用来带大家快速掌握easyui的使用。 easyui是博主最喜欢的前端框架,没有之一,因为它提供了多种主题,而且有圆润的各种组件。 目录 一、快速开始 二、准备工作…

《研发效能(DevOps)工程师》课程简介(五)丨IDCF

由国家工业和信息化部教育与考试中心颁发的职业技术证书,也是国内首个研发效能(DevOps)职业技术认证,内涵1000页学习教材2000分钟的课程内容讲解460多个技术知识点300多道练习题。 在这里,你不仅可以了解到华为、微软、…

AMESim 2021安装教程

主要是AMESim的安装 写在前面,由于项目需要,需要自学AMESim,因此需要安装这个软件,目前仅仅安装使用,还不涉及到与MATLAB的联合仿真,老板说用 RT LAB半实物仿真平台,但是简单搜了一下&#xff0…

小程序如何设置下单提示语句

下单提示会展示在购物车和提交订单页面,它可以帮助商家告知客户事项,提高用户体验和减少错误操作。例如提示:商品是否包邮、某些区域是否发货、商品送达时间等等。 在小程序管理员后台->配送设置处,填写下单提示。在设置下单提…

工作学习记录

1、Spring的Lifecycle和SmartLifecycle Spring的Lifecycle和SmartLifecycle,可以没用过,但不能不知道!-CSDN博客 2、Shiro安全框架提供了认证、授权、企业会话管理、加密、缓存管理相关的功能,使用Shiro可以非常方便的完成项目的…

【Git】中Gui的使用和SSH协议的讲解及IDEA开发中使用git

目录 一、Gui使用 1. 使用 2. 功能 二、SSH协议 1. 讲解 2. 生成密钥 3. 远程仓库绑定公钥 三、IDEA使用 1. IDEA配置git 2. IDEA安装gitee 3. IDEA中登入Git 4. 项目分享 5. 克隆分享的项目 6. idea上传远程 一、Gui使用 (Gui) 是指图形用户界面,它…

引用(类名后加符号)和指针的区别

它们的区别: ①从现象上看, 指针在运行时可以改变其所指向的值, 而引用一旦和某个对象绑定后就不再改变。 这句话可以理解为: 指针可以被重新赋值以指向另一个不同的对象。 但是引用则总是指向在初始化时被指定的对象&#x…

node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)

前言 提示:使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档:http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码(连接mongodb 服务)3.…
最新文章