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

news2024/9/28 9:30:28

#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"}))

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】 课本里章节里所有蓝色字体的思维导图

Spire.Office for Java 8.10.2 同步更新Crk

Spire.Office for Java 是 E-iceblue 提供的企业级 Office Java API 的组合。它包括Spire.Doc for Java、Spire.XLS for Java、Spire.Presentation for Java、Spire.PDF for Java和Spire.Barcode for Java。 开发人员可以使用Spire.Office for Java在Java应用程序中执行各种办…

【electron】【附排查清单】记录一次逆向过程中,fetch无法请求http的疑难杂症(net::ERR_BLOCKED_BY_CLIENT)

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ Adblock等插件拦截2️⃣ 【失败】Content-Security-Policy启动服务器json-serverhtml中的meta字段 3️⃣ 【失败】https vs httpwebPreferences & allowRunningInsecureContent disable-features 4️⃣ 【失败】检测fetch…

技术分享 | app自动化测试(Android)--元素定位方式与隐式等待

元素定位是 UI 自动化测试中最关键的一步,假如没有定位到元素,也就无法完成对页面的操作。那么在页面中如何定位到想要的元素,本小节讨论 Appium 元素定位方式。 Appium的元素定位方式 定位页面的元素有很多方式,比如可以通过 I…

初识Java 17-2 反射

目录 转型前检查 构建例子:生成层次结构 优化Creator:使用类字面量 优化PetCounter:动态验证类型 更通用的递归计数 注册工厂 本笔记参考自: 《On Java 中文版》 转型前检查 当我们使用传统的类型转换,例如&…

实战!工作中常用的设计模式

文章目录 前言一、策略模式1.1、 业务场景1.2 、策略模式定义1.3、 策略模式使用1.3.1、一个接口,两个方法1.3.2、不同策略的差异化实现1.3.3、使用策略模式 二、责任链模式2.1、业务场景2.2、责任链模式定义2.3、责任链模式使用2.3.1、一个接口或者抽象类2.3.2、每…

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器

信号发生器 方波,就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加,Mode为0则减;只要为0就输出zero 这样会出问题,因为要求是十进制,但是这里并没有考虑到9之后怎么办&a…

openvino学习(一)ubuntu20.04安装openvino2022

安装openvino2022要求 操作系统 Ubuntu 18.04 长期支持 (LTS),64 位 Ubuntu 20.04 长期支持 (LTS),64 位 软件 CMake 3.13 或更高版本,64 位 GCC 7.5.0(适用于 Ubuntu 18.04)或 GCC 9.3.0(适用于 Ubunt…

工具介绍——第三方软件远程连接(工具:Rustdesk)

文章目录 前言一、使用工具二、开始演示1、拿下目标主机权限后上传文件2、运行目标主机上的rustdesk-1.1.9.exe文件3、目标主机上whoami查看现在的用户4、查找目标主机上连接的文件,并添加连接密码5、目标主机重启rustdesk的应用程序6、本地连接主机 前言 这里主要…

“第六十三天”

这两天怎么做的这么别扭,为什么我的vs 的strlen函数包括终止字符了; 哦哦,明白了,fgets函数读取在未达到指定字长,或者遇见空白符之前,会读取前面的所有字符,所以会读取换行符,而get…

康耐视深度学习ViDi-View菜单介绍

Accept View承认当前图片标注的有效性 Clear Marking 清除当前图片的标注特征 Clear Marking & Labels清除当前图片的标注特征和标签 Process处理当前图片 Edit ROI编辑检测的区域 Edit Regions编辑(标注)特征区域 Edit Mask 编辑遮挡(屏蔽)区域 Apply Mask To Tool将遮挡(…

杨辉三角(Java实现)

public class Demo09 {public static void main(String[] args) {//第一位和最后一位都为1//除了每行的第一列之外,其余的数为a[i][j]aa[i-1][j]a[i-1][j-1];int[][] arrays new int[10][10];for(int i 0;i<10;i){if(i0){ //第一行直接赋值为0arrays[i][0]1;continue;//重…

深入理解强化学习——多臂赌博机:基于置信度上界的动作选择

分类目录&#xff1a;《深入理解强化学习》总目录 因为对动作—价值的估计总会存在不确定性&#xff0c;所以试探是必须的。贪心动作虽然在当前时刻看起来最好&#xff0c;但实际上其他一些动作可能从长远看更好。 ϵ − \epsilon- ϵ−贪心算法会尝试选择非贪心的动作&#xf…

ZipInputStream解压报错java.lang.IllegalArgumentException: MALFORMED

背景 使用jdk自带的zip工具ZipInputStream&#xff0c;去读取使用winrar在中文windows制作出来的zip文件报错。 Exception in thread "main" java.lang.IllegalArgumentException: MALFORMEDat java.util.zip.ZipCoder.toString(ZipCoder.java:58)at java.util.zip…

Qwt QwtWheel绘制滚动轮

1.简介 QwtWheel 是一个用于实现滚动轮控件的类库。它基于 Qt 框架&#xff0c;并提供了一些方便的功能来处理滚动轮的事件和绘图。 QwtWheel 类继承自 QWidget类&#xff0c;用于定义滚动轮控件的通用行为。QwtWheel 添加了特定于滚动轮的功能。 QwtWheel 可以用于创建具有滚…

Spring Cloud之多级缓存

目录 传统缓存 多级缓存 JVM进程缓存 Caffeine 缓存驱逐策略 实现进程缓存 常用Lua语法 数据类型 变量声明 循环使用 定义函数 条件控制 安装OpenResty 实现Nginx业务逻辑编写 请求参数解析 实现lua访问tomcat JSON的序列化和反序列化 Tomcat的集群负载均衡 …

云表平台突破传统,企业级低代码让软件开发速度提升

随着数字化进程的加速推进&#xff0c;软件开发效率和成本的要求也在日益提高。在这个背景下&#xff0c;低代码技术的出现为企业软件开发提供了新的解决方案。低代码开发平台以其简单易用、高效灵活的特点&#xff0c;已经成为各行各业企业进行应用开发的首选工具。 企业中低代…

生成无损压缩png和有损压缩png的做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> png是一种常用的图像格式。png一般为无损压缩,但是可以是有损压缩的。 下图都是100x100的png图像,一个是无损压缩,一个是有损压缩。 看着效果基本一样,但是它们的大小相差很大,无损…

个体诊所管理系统电子处方软件,个体诊所人员服务软件,佳易王电子处方开单系统

个体诊所管理系统电子处方软件&#xff0c;个体诊所人员服务软件&#xff0c;佳易王电子处方开单系统 软件功能&#xff1a; 1、常用配方模板&#xff1a;可以自由添加配方分类&#xff0c;预先设置药品配方。 2、正常开药&#xff1a;可以灵活选择药品&#xff0c;用法用量&…

Qt 4.8.6 的下载与安装

Qt 4.8.6 的下载与安装 Qt 4.8.6 的下载与安装下载并解压 MinGW 4.8.2Qt4.8.6 库的安装Qt Creator 3.3.0 的安装配置 Qt Creator测试 官方博客&#xff1a;https://www.yafeilinux.com/ Qt开源社区&#xff1a;https://www.qter.org/ Qt 4.8.6 的下载与安装 学习《Qt Creato…