python代码打包成.so的方法

前提条件:

  • 确保电脑已经安装gcc且终端能检索到
  • 确保Python中已经安装cython包,若未安装,则先使用pip install cython进行安装

打包方法:

  • step1:编写编译脚本setup.py,代码如下:

    # encoding = utf-8
    from distutils.core import setup
    from Cython.Build import cythonize
    setup(
    name = 'libname',
    ext_modules = cythonize(["file1.py", "file2.py", 	"dir/file3.py"], language_level = "3")
    )
    
  • step2:终端中执行:

    python3 setup.py build_ext
    

需要注意的点:

  1. setup()中的ext_modules不是exe_modules,千万不要打错了,如果打错了,你会发现只编译成了.c文件,而没用生成.so
  2. 生成的.so只能在打包计算机相同系统、相同平台及相同python版本环境下使用,要想在其他平台或环境下使用,需要在指定平台或环境下重新打包
  3. 存在多个python版本时,如在linux下博主python2和python3共存,需要指定编译用的python版本,否则终端会报警告FutureWarning: Cython directive ‘language_level’ not set, using 2 for now (Py2)。指定版本有两种方式:
    • method 1: 在每个要打包的py文件头部写入# cython:language_level=3
    • method 2: 像上述setup.py中一样,在cythonize函数中加入language_level = "3"选项
  4. 打包完的.so文件结构会被打乱,如上述dir中的file3.py生成的file3.so与其他两个同目录,而不是在dir文件夹下,如果不做调整,执行脚本时可能存在import错误,因此还要手动调整一下文件结构

附批量打包的代码:


import os
import sys
import shutil
import numpy
import tempfilefrom setuptools import setup
from setuptools.extension import Extensionfrom Cython.Build import cythonize
from Cython.Distutils import build_ext
import platform# code from:   https://blog.csdn.net/qq_33375598/article/details/118677130# 构建后存放的文件目录
build_root_dir = 'build/lib.' + platform.system().lower() + '-' + platform.machine() + '-' + str(sys.version_info.major) + '.' + str(sys.version_info.minor)print(build_root_dir)extensions = []
ignore_folders = ['build', 'test', 'tests']
conf_folders = ['conf']def get_root_path(root):if os.path.dirname(root) in ['', '.']: # 得到文件的文件路径return os.path.basename(root) # 返回path最后的文件名else:return get_root_path(os.path.dirname(root))def copy_file(src, dest):if os.path.exists(dest): # 目的文件存在返回returnif not os.path.exists(os.path.dirname(dest)): # 目的文件夹不存在,递归创建文件夹os.makedirs(os.path.dirname(dest))if os.path.isdir(src): # 判断某一路径是否为目录shutil.copytree(src, dest) # 拷贝整个文件夹(目的文件夹需要不存在,否则会失败)else:shutil.copyfile(src, dest) # 拷贝整个文件def touch_init_file(): # 在临时文件夹中创建initinit_file_name = os.path.join(tempfile.mkdtemp(), '__init__.py')with open(init_file_name, 'w'):passreturn init_file_nameinit_file = touch_init_file()
print(init_file)def compose_extensions(root='.'):for file_ in os.listdir(root): # 当前目录下的所有文件abs_file = os.path.join(root, file_) # 路径拼接if os.path.isfile(abs_file):if abs_file.endswith('.py'):extensions.append(Extension(get_root_path(abs_file) + '.*', [abs_file]))elif abs_file.endswith('.c') or abs_file.endswith('.pyc'):continueelse:copy_file(abs_file, os.path.join(build_root_dir, abs_file))if abs_file.endswith('__init__.py'): # 用空白的__init__.py替代原有的copy_file(init_file, os.path.join(build_root_dir, abs_file))else:if os.path.basename(abs_file) in ignore_folders: # 忽略的文件不拷贝continueif os.path.basename(abs_file) in conf_folders: # 配置文件一同拷贝copy_file(abs_file, os.path.join(build_root_dir, abs_file))compose_extensions(abs_file)compose_extensions()
os.remove(init_file)setup(name='your_project_name',version='1.0',ext_modules=cythonize(extensions,nthreads=16,compiler_directives=dict(always_allow_keywords=True),include_path=[numpy.get_include()], language_level="3"),cmdclass=dict(build_ext=build_ext))

参考链接:

  • https://blog.csdn.net/qq_33375598/article/details/118677130
  • ht
  • tps://blog.csdn.net/weixin_36755535/article/details/127300870

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

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

相关文章

生成对抗网络(DCGAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步) 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、创建模型1. 生成器2. 判别器 四、定义损失函数和优化器1. 判别器损失2. 生成器损失 五、定义训练循环六、训练模型七、创建 G…

“前端八股文背诵版“,终于整理完了,堪称最强!

随着互联网的快速发展,前端开发领域成为了IT行业中的热门领域之一。很多求职者都希望能够进入这个领域,但是面对着如此激烈的竞争,很多人都感到无从下手。为了帮助大家更好地掌握前端开发的相关知识,小编整理了一份前端面试题合集…

单片机怎么实现真正的多线程?

单片机怎么实现真正的多线程? 不考虑多核情况时,CPU在一个时间点只能做一件事,因为切换的速度快所以看起来好像是同时执行多个线程而已。 实际上就是用定时器来做时基,以时间片的方式分别执行来实现的,只不过实现起来细节比较复…

网络安全应急响应-Server2228(环境+解析)

网络安全应急响应 任务环境说明: 服务器场景:Server2228(开放链接)用户名:root,密码:p@ssw0rd123

【代码】考虑差异性充电模式的电动汽车充放电优化调度matlab-yalmip-cplex/gurobi

程序名称:考虑差异性充电模式的电动汽车充放电优化调度 实现平台:matlab-yalmip-cplex/gurobi 代码简介:提出了一种微电网中电动汽车的协调充电调度方法,以将负荷需求从高峰期转移到低谷期。在所提出的方法中,基于充…

RHEL8.9 静默安装Oracle19C

RHEL8.9 静默安装Oracle19C 甘肃圆角网络科技开发有限公司 说明(GUI):  1.实际业务场景中,Linux环境一般情况下是没有GUI的。没有GUI并不意味着没有安装图形界面。可能在部署Linux操作系统环境的时候安装了桌面环境,只是启动的时候设置了启动…

英国人工智能初创公司Stability AI面临卖身压力;深度学习中的检索增强生成简介

🦉 AI新闻 🚀 英国人工智能初创公司Stability AI面临卖身压力 摘要:多位知情人士透露,英国人工智能初创公司Stability AI正寻求出售公司,因为投资者对其财务状况的压力越来越大。管理层最近几周一直将自己标榜为收购…

MapInfo Pro错误提示:This operation requires elevated privileges……

尝试删除MapInfo Pro时出现错误“此操作需要提升权限。将产品DVD/CD插入媒体播放器并双击setup.exe文件重新启动。此安装程序现在将中止。”。 原因: 这可能是由于权限问题。 解决方式: 1.如果MapInfo Pro setup.exe可用,请执行以下步骤&…

笔记64:Bahdanau 注意力

本地笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章:动手学深度学习~注意力机制 a a a a a a a a a a a

FIORI /N/UI2/FLP 始终在IE浏览器中打开 无法在缺省浏览器中打开

在使用/N/UI2/FLP 打开fiori 启动面板的时候,总是会在IE浏览器中打开,无法在缺省浏览器打开 并且URL中包含myssocntl 无法正常打开 启动面板 这种情况可以取消激活ICF节点/sap/public/myssocntl

java中@Async注解在CompletableFuture.runAsync里面使用没有生效的原因?

在Java中,Async注解通常与Spring框架一起使用以实现异步方法调用。然而,CompletableFuture.runAsync()是Java标准库中的方法,并不受Async注解的影响。 Async注解只能被Spring容器识别和处理,因此只能在由Spring管理的组件&#x…

spring boot 3.2.0 idea从零开始

spring boot 3.2.0 idea从零开始 最新的spring initilizer 不再支持低版本java,只能选择17、21 。 我也被迫尝试下最新版本的java。 jdk下载地址 自定义好artifact和group之后点击下一步。 在这里选择需要的组件,我准备做web项目所以只选择spring web …

word模板导出word文件

前期准备工作word模板 右键字段如果无编辑域 ctrlF9 一下&#xff0c;然后再右键 wps 直接 ctrlF9 会变成编辑域 pom.xml所需依赖 <dependencies> <!--word 依赖--> <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId…

vim工具以及如何给用户加上sudo的权限

Linux开发工具之vim以及如何给用户配置sudo的权限文件的操作 1.vim概念的介绍 2.vim的多模式的介绍 3.vim的命令模式与低行模式的相关指令操作 4.vim如何配置 5.如何给普通用户配置sudo的权限 本文开始~~~~ 1. vim概念的介绍 vim是一款多模式的文本编辑器&#xff0c;简单…

C语言-指针讲解(4)

在上一篇博客中&#xff1a; C语言-指针讲解(3) 我们给大家介绍了指针进阶的用法 让下面我们来回顾一下讲了什么吧&#xff1a; 1.字符指针变量类型以及用法 2.数组指针本质上是一个指针&#xff0c;里面存放数组的地址。而指针数组本质上是个数组&#xff0c;里面存放的是指针…

iOS系统上待办事项提醒软件哪个好

在这个快节奏的生活中&#xff0c;各种待办事项充斥了我们的日常工作和生活&#xff0c;尤其对于像我这样的iPhone用户而言&#xff0c;一款能够在iOS系统上快速和准确记录和提醒待办事项的软件&#xff0c;显得至关重要。 正如前几天&#xff0c;我正沉浸在工作中的时突然被领…

将ipynb文件转为py的两种方法

解决方案&#xff1a; 方法一&#xff1a;jupyter notebook打开后另存为.py文件&#xff08;方便快捷&#xff09; 用jupyter notebook打开后&#xff0c;选左上角 File &#xff0c; Download as &#xff0c;选择 Python(.py) 即可保存为.py格式的文件 方法二&#xff1a;…

Python|OpenCV-性能测试以及优化方法(9)

前言 本文是该专栏的第9篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在面对图像处理的项目需求时,要知道程序每秒都会处理大量的数据工作,而我们想要让程序达到实用的效果。必须要让自己的代码能提供最准确的解决方法,且该方法能以最快的效率去执行完成。所…

【算法】Rabin-Karp 算法

目录 1.概述2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法&#xff1a; 【算法】Brute-Force 算法 【算法】KMP 算法 1.概述 &#xff08;1&#xff09;Rabin-Karp 算法是由 Richard M. Karp 和 Michael O. R…

时间序列预测 — LSTM实现多变量多步负荷预测(Keras)

目录 1 数据处理 1.1 数据集简介 1.2 数据集处理 2 模型训练与预测 2.1 模型训练 2.2 模型多步预测 2.3 结果可视化 1 数据处理 1.1 数据集简介 实验数据集采用数据集6&#xff1a;澳大利亚电力负荷与价格预测数据&#xff08;下载链接&#xff09;&#xff0c;包括数…