当前位置: 首页 > news >正文

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

相关文章:

  • 小程序如何设置自取模式下的服务方式
  • Spring Cloud之多级缓存
  • JavaScript 基本数据类型
  • PO、VO、DAO、BO、DTO、POJO到底代表啥
  • 71 内网安全-域横向网络传输应用层隧道技术
  • springboot自己添加的配置文件没有绿色叶子问题
  • 【Head First 设计模式】-- 策略模式
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • 【寒武纪(3)】媒体处理系统的系统控制、视频输入和后处理子系统
  • 第九周实验记录
  • 城市内涝怎么预警?万宾科技内涝积水监测仪
  • macos端串口调试推荐 serial直装激活 for mac
  • 计算机中丢失mfc140u.dll怎么解决
  • 深度学习入门-基于Python的理论与实现摘要记录
  • 前端面试题之HTML篇
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • AWS实战 - 利用IAM对S3做访问控制
  • canvas 绘制双线技巧
  • create-react-app项目添加less配置
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Js基础知识(一) - 变量
  • MySQL-事务管理(基础)
  • PHP面试之三:MySQL数据库
  • spring boot下thymeleaf全局静态变量配置
  • Yii源码解读-服务定位器(Service Locator)
  • 从伪并行的 Python 多线程说起
  • 规范化安全开发 KOA 手脚架
  • 前端性能优化--懒加载和预加载
  • 如何进阶一名有竞争力的程序员?
  • 数据可视化之 Sankey 桑基图的实现
  • 思否第一天
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 无服务器化是企业 IT 架构的未来吗?
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #1015 : KMP算法
  • (¥1011)-(一千零一拾一元整)输出
  • (LeetCode C++)盛最多水的容器
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (论文阅读40-45)图像描述1
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .cfg\.dat\.mak(持续补充)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NetCore 如何动态路由
  • .Net接口调试与案例
  • .net流程开发平台的一些难点(1)
  • /run/containerd/containerd.sock connect: connection refused
  • /usr/bin/env: node: No such file or directory