python代码封装二进制文件并使用C#调用方案

news2024/11/23 8:31:53

思路

首先使用Cython库将python代码生成二进制文件pyd,然后使用C#中的pythonnet的Nuget包来进行调用,python代码中可以使用第三方类库

Cython使用

Cython的安装

在命令行中使用如下语句即可安装Cython

pip install cython

pyd文件格式

Cython用于编写Python扩展模块,并且拥有较高的执行性能。Cython将源代码转译成C或C++语法后,自动包装上函数调用生成.pyd(或 .so ,因操作系统而异)后缀的二进制文件,该文件可当成普通的Python类库。

如果有pyd文件testCopy.pyd用于测试,在其中使用OpenCV库进行简单的图像读取和写出(OpenCV库不重要,意为可以使用第三方类库),在源码中可以使用如下代码来引入testCopy.pyd中包含的testCopy:

import testCopy

要使用test中的函数add(i,j),可以如下方式进行:

testCopy.add(5,7)

Cython库的使用

在包含源代码的目录下创建setup.py,用于根据源码生成pyd文件,setup.py的代码内容如下:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules= cythonize("testCopy.py") # test.py为要转化为pyd文件的源代码
)

使用如下命令运行setup.py代码来生成pyd文件

python setup.py build_ext --inplace

如果生成成功,会产生如下图所示的结果
请添加图片描述

假设testCopy.py中写了一个简单的函数copyImage,这里引入了OpenCV库,因此该代码具有普遍性可以引入第三方类库

import cv2

def copyImage(inputPath, outputPath):
    img=cv2.imread(inputPath, cv2.IMREAD_COLOR)
    cv2.imwrite(outputPath, img)
    print("已经复制图片") # 增加输出来显示结果

测试pyd文件

可以使用python引入testCopy类库来进行测试

import testCopy

testCopy.copyImage("img.jpg","output.jpg")

执行得到如下结果:
请添加图片描述

图片已经被成功复制

C#调用pyd文件

安装pythonnet包

Nuget包管理页面搜索pythonnet包,安装即可。
请添加图片描述
创建C#命令行项目,输入如下代码:

using Python.Runtime;

//初始化python环境
Runtime.PythonDLL = @"E:\Programs\python39\python39.dll";
PythonEngine.Initialize();
PythonEngine.PythonPath = @"E:\Programs\python39;E:\Programs\python39\Lib;E:\Programs\python39\Lib\site-packages";

dynamic test = Py.Import("testCopy");
test.copyImage("img.jpg", "output2.jpg");

PythonEngine.Shutdown();

要使得pyd能够使用第三方的类库,重点是需要配置PythonEngine.PythonPath选项,需要设置将该选项设置为 python安装位置、python安装位置\LIB 和 python安装目录\Lib\site-packages,来保证python运行环境能够找到相应的类库

测试结果:
请添加图片描述

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

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

相关文章

服务器中勒索病毒怎么解决?勒索病毒解密,数据恢复

服务器中勒索病毒是一件低频、高概率的事情。而且一旦用户的服务器中招以后,想要处理无论是经济成本还是时间成本都非常的高。也会对企业的生产经营造成很大的影响。所以绝大多数企业主都很关心服务器中勒索病毒后怎么解决。针对这个问题,云天数据恢复中…

ArcGIS API for JavaScript部署开发

官方快速上手教程:https://developers.arcgis.com/javascript/latest/ 官方 API 参考文档:https://developers.arcgis.com/javascript/latest/api-reference 文章目录 0.前言1.引入ArcGIS API for JavaScript部署开发1.1在线引入(via CDN&…

任务工单发送失败重试方案设计

需求背景: 该系统为一个工单系统,其中任务工单为该系统中的一个模块;任务工单它是需要周期性调度的一种任务类型;可以按照用户配置的时间周期定时性触发的。由于任务需要发送到对应的工作人员上,所以这里需要先对员工进…

学习Origin

最近,在学习Origin软件,网上资源还是很多的。我简单地记录了Origin的一些知识点,来督促自己的学习。 了解一下Origin的作用。 Origin入门教程(一):一文学会Origin (sousepad.com) 该文讲述了Origin的一些基…

从城市吉祥物进化到虚拟人IP需要哪些步骤?

在2023年成都全国科普日主场活动中,推出了全国首个科普数字形象大使“科普熊猫”,科普熊猫作为成都科普吉祥物,是如何进化为虚拟人IP,通过动作捕捉、AR等技术,活灵活现地出现在大众眼前的? 以广州虚拟动力虚…

性能测试工具概念指的是什么

性能测试工具是一类用于模拟多种负载情况下应用程序行为的软件。它们可用于测量应用程序的响应时间、吞吐量、资源利用率和稳定性。本文将介绍性能测试工具常见几种类型有哪些! 性能测试工具通常分为以下几种类型: 1、负载测试工具: 这些工具用于模拟多个…

SQL多表设计--一对多(外键)

-- 完成部门和员工的-- 选择当前db03 这个数据库use db03;-- 查看当前选中的数据库select database();-- 创建员工表create table tb_emp (id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment 用户名,password varchar(32)…

【网路安全 --- pikachu靶场安装】超详细的pikachu靶场安装教程(提供靶场代码及工具)

一,资源下载 所用到的工具是: VMware16.0 虚拟机 windows server 2003 phpstudy 2018 pikachu 靶场代码 notepadd 文本编辑器 360zip VMware 虚拟机 参照以下博客安装,如果已安装则忽略 【网络安全 --- 工具安装】VMware 16.0 详细安装过…

滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

如何编写性能测试用例?

前言 写测试用例,是测试绕不开的工作内容,不管是功能、自动化,还是性能。先来回顾一下功能测试用例主要包含的要素:测试用例编号、测试标题、所属模块、测试需求项编号、案例状态、预置条件、优先级、测试输入、操作步骤、预期输…

智慧茶园:茶厂茶园监管可视化视频管理系统解决方案

一、方案背景 我国是茶叶生产大国,茶叶销量全世界第一。随着经济社会的发展和人民生活水平的提高,对健康、天然的茶叶产品的消费需求量也在逐步提高。茶叶的种植、生产和制作过程工序复杂,伴随着人力成本的上升,传统茶厂的运营及…

Scala第十九章节

Scala第十九章节 scala总目录 文档资料下载 章节目标 了解Actor的相关概述掌握Actor发送和接收消息掌握WordCount案例 1. Actor介绍 Scala中的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。我们学习Scala Actor的目的主要是为后续学习Akka做准备。 1.1 Ja…

递归和分治算法(2)--合并排序和快速排序

目录 一、合并排序相关题 1、合并排序 2、逆序对 二、快速排序相关题 1、快速排序 目录 一、合并排序相关题 1、合并排序 2、逆序对 二、快速排序相关题 1、快速排序 2、中位数选取 三、循环赛日程表 一、合并排序相关题 1、合并排序 合并排序的原理:…

一文读懂|zRAM 内存压缩机制

内存是计算机系统最重要的资源之一,当操作系统内存不足时,进程申请内存将会失败,从而导致其运行异常或者崩溃。 Linux 内核提供 swap 机制来解决内存不足的情况,其原理是: 当系统内存不足时,内核会将进程不…

线性数据—栈、队列、链表

一、栈 Stack(存取O(1)) 先进后出,进去123,出来321。 基于数组:最后一位为栈尾,用于取操作。 基于链表:第一位为栈尾,用于取操作。 1.1、数组栈 /*** 基于数组实现的顺序栈&#…

记录:Unity脚本的编写2.0

目录 前言控制方法键盘控制鼠标控制虚拟控制器控制 平移和旋转 前言 前面记录了一些简单的unity脚本用来控制unity中对象模型的移动(或者不能叫控制,毕竟它是开启之后自己在跑的),那么让模型可以根据用户的操作来进行变化的方法自…

SQL监控工具

什么是 SQL 监控 SQL 监视是跟踪和分析整个 MSSQL 生态系统的过程,以识别性能问题并防止依赖数据库的应用程序变慢和/或遇到中断,它有助于获取有关 SQL 服务器的数据库会话、查询、作业、CPU 和内存资源、群集、配置和可用性组的信息。 为什么 MSSQL 监…

JavaScript 笔记: 函数

1 函数声明 2 函数表达式 2.1 函数表达式作为property的value 3 箭头函数 4 构造函数创建函数(不推荐) 5 function 与object 5.1 typeof 5.2 object的操作也适用于function 5.3 区别于⼀般object的⼀个核⼼特征 6 回调函数 callback 7 利用function的pr…

TensorFlow入门(十、共享变量)

使用tf.Variable方法创建变量 使用tf.Variable方法创建变量时有两点需要注意: ①一般情况下,使用tf.Variable方法创建的变量都有作用域,也可叫做变量的可用性范围,即在变量所属的模型内,变量的名字是有效可用的。 ②使用tf.Variable方法创建变量时,会生成一个新的变量。如果在一…

激活函数与loss的梯度

激活函数: 最开始由生物学家对青蛙的神经元机制进行研究发现,青蛙的神经元有多个输入x0、x1、x2,响应值是他们加权后的结果,但响应值如果小于阈值,则不会响应,而只有大于阈值时,才会有固定的响应…