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

news/2024/5/16 5:26:00/文章来源:https://blog.csdn.net/weixin_46366218/article/details/133682630

思路

首先使用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 cythonizesetup(ext_modules= cythonize("testCopy.py") # test.py为要转化为pyd文件的源代码
)

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

python setup.py build_ext --inplace

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

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

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

测试pyd文件

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

import testCopytestCopy.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.luyixian.cn/news_show_179820.aspx

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

相关文章

Java——StringBuffer类常用操作示例

Java——StringBuffer类常用操作 package com.yushifu.javaAPI;import java.sql.SQLOutput;//StringBuffer类(字符串缓冲区) //StringBuffer类与String的区别————StringBuffer的内容和长度都是可以改的 //StringBuffer类似于一个字符容器&#xff0…

【数据结构】栈和队列-- OJ

目录 一 用队列实现栈 二 用栈实现队列 三 设计循环队列 四 有效的括号 一 用队列实现栈 225. 用队列实现栈 - 力扣(LeetCode) typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct …

pdf文档内容提取pdfplumber、PyPDF2

测试pdfplumber识别效果好些;另外pdf这两个如果超过20多页就没法识别了,结果为空 1、pdfplumber 安装:pip install pdfplumber -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com代码: import pdfpl…

应用超高频RFID技术的银行款箱柜资产管理系统

背景概述 随着银行后台管理的集中化思路,对款箱的管理需要实现“安全、高效”的“管、控、营”一体化,传统的人工款箱管理模式和数据采集方式已无法满足银行管理的快速、准确要求,严重影响了银行整体运行效率。 传统的款箱管理存在以下问题…

数据结构 | (三) Stack

栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO ( Last In First Out )的原则。 压栈:栈…

【面试经典150 | 哈希表】赎金信

文章目录 写在前面Tag题目来源题目解读解题思路方法一:哈希表方法二:数组模拟哈希表 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带…

mp4视频太大怎么压缩变小?

mp4视频太大怎么压缩变小?确实,很多培训和教学都转向了线上模式,这使得我们需要下载或分享大量的在线教学视频。然而,由于MP4视频文件通常较大,可能会遇到无法打开或发送的问题。为了解决这个问题,我们可以…

网络安全(黑客)——自学

前言: 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“…

ToBeWritten之让响应团队参与并做好沟通

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

【yolov系列:yolov7改进添加SE注意力机制】

yolo系列文章目录 学习视频: YOLOV7改进-添加注意力机制_哔哩哔哩_bilibili 文章目录 yolo系列文章目录一、SE注意力机制是什么?二、yolov7改进添加SE注意力机制1.首先从github粘贴SE.py2.复制109行的conv3.在sppc加注意力机制 三、添加注意力机制在Conc…

DM宣传单制作,利用在线模板,快速替换文字

如果你需要制作一批宣传单,但是时间很紧,而且没有专业的设计人员协助,那么你可以选择使用在线模板来快速制作宣传单。本文将介绍如何使用乔拓云平台,快速制作宣传单的方法。 步骤一:选择适合的在线制作工具 首先&…

【多线程案例】设计模式-单例模式

1.单例模式 什么是单例模式? 所谓单例,即单个实例。通过编码技巧约定某个类只能有唯一一个实例对象,并且提前在类里面创建好一个实例对象,把构造方法私有化,再对外提供获取这个实例对象的方法,&#xff0…

腾讯云/阿里云国际站免费账号:腾讯云国际站如何对象存储cos设置防盗链

简介 为了避免恶意程序使用资源 URL 盗刷公网流量或使用恶意手法盗用资源,腾讯云国际站给用户带来不必要的损失。腾讯云对象存储支持防盗链配置,建议您通过控制台的防盗链设置配置黑/白名单,来进行安全防护。 注意: 如果您访问对…

北京筑龙全面赋能!打造公共资源交易一体化整合“内蒙模式”

近日, 由内蒙古自治区公共资源交易中心(以下简称中心)与北京筑龙联合建设的内蒙古公共资源交易平台一体化整合项目顺利完成验收工作。该平台的顺利验收标志着这个以科技创新和管理创新“双创”为驱动,以实现公共资源交易全流程电子…

Headless CMS(strapi)

Headless CMS(strapi) 玩了玩微信小程序的cms,感觉还挺好的,不过目前处于公测阶段,后续应该还是要收费的,不过这个操作还挺好的。文档地址 不过其获取图片的时候默认用到的是小城云开发环境的链接样式,如果用在公开网…

问题:remote: HTTP Basic: Access denied

参看文章:https://baijiahao.baidu.com/s?id1740126019873950482&wfrspider&forpc 解决方法一 (最有效) 输入:git config --system --unset credential.helper 再次进行 Git 操作,输入正确的用户名,密码即可。

Unity实现设计模式——策略模式

Unity实现设计模式——策略模式 策略模式是一种定义一些列算法的方法,这些所有的算法都是完成相同的工作,只是实现不同。它可以通过相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。 策略模式的 Strategy 类层次为 Contex…

用正则表达式验证用户名和跨域postmessage

正则验证用户名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…

AT9110H-单通道低压 H桥电机驱动芯片

AT9110H能够驱动一个直流有刷电机或其它诸如螺线管的器件。输出驱动模块由PMOSNMOS功率管构成的H桥组成&#xff0c;以驱动电机绕组。AT9110H能够提供高达12V1A的驱动输出。 AT9110H是SOP8封装&#xff0c;且是无铅产品&#xff0c;符合环保标准。 AT9110H具有一个PWM (IN1/IN2…