当前位置: 首页 > 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篇
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Angular 响应式表单之下拉框
  • Asm.js的简单介绍
  • bootstrap创建登录注册页面
  • jquery cookie
  • PHP 小技巧
  • PHP的Ev教程三(Periodic watcher)
  • Vue.js源码(2):初探List Rendering
  • Vue实战(四)登录/注册页的实现
  • 对超线程几个不同角度的解释
  • 前端之React实战:创建跨平台的项目架构
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 物联网链路协议
  • 用Visual Studio开发以太坊智能合约
  • 鱼骨图 - 如何绘制?
  • 做一名精致的JavaScripter 01:JavaScript简介
  • #传输# #传输数据判断#
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (太强大了) - Linux 性能监控、测试、优化工具
  • .net core 6 集成和使用 mongodb
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET命名规范和开发约定
  • .net项目IIS、VS 附加进程调试
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • :not(:first-child)和:not(:last-child)的用法
  • [ 蓝桥杯Web真题 ]-布局切换
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [GXYCTF2019]禁止套娃
  • [Java安全入门]三.CC1链
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [leetcode] Multiply Strings