C#调用Python代码的方式(二),以PaddleOCR-GUI为例

news/2025/3/9 22:30:58/文章来源:https://www.cnblogs.com/mingupupu/p/18612101

前言

前面介绍了在C#中使用Progress类调用Python脚本的方法,但是这种方法在需要频繁调用并且需要进行数据交互的场景效果并不好,因此今天分享的是C#调用Python代码的方式(二):使用pythonnet调用Python代码。

pythonnet介绍

Python.NET 是一个包,为 Python 程序员提供了与 .NET 公共语言运行时 (CLR) 几乎无缝的集成,并为 .NET 开发者提供了一个强大的应用程序脚本工具。它允许 Python 代码与 CLR 交互,也可以用于将 Python 嵌入到 .NET 应用程序中。

image-20241217120710093

使用pythonnet,以PaddleOCR-GUI为例

在使用pythonnet之前,需要搞清楚它的三个概念,分别是 Runtime.PythonDLLPythonEngine.PythonHomePythonEngine.PythonPath,搞清楚了这些,使用起来就很方便了。

image-20241217120547972

先来看Runtime.PythonDLL如何指定。

比如你用Python3.12创建了一个虚拟环境,但是在这个虚拟环境,找不到DLL文件,这时候你需要去原始的那个Python3.12文件夹中去找:

image-20241217120934674

我这里对应的路径是:C:\Users\25398\AppData\Local\Programs\Python\Python312\python312.dll。

再来看PythonEngine.PythonHome如何指定。

PythonEngine.PythonHome写你创建的虚拟环境中的python.exe,这里我对应的是:

image-20241217121302447

最后再来看看PythonEngine.PythonPath如何指定。

PythonEngine.PythonPath是指运行你的python代码所需的所有目录,包括你写的python代码所在的目录,虚拟环境的一些目录,原始环境的一些目录,这里我对应的如下所示:

D:\Learning\PaddleOCR\;
D:\Learning\PaddleOCR\PaddleOCRVENV\Lib;
D:\Learning\PaddleOCR\PaddleOCRVENV\Lib\site-packages;
C:\Users\25398\AppData\Local\Programs\Python\Python312\Lib;
C:\Users\25398\AppData\Local\Programs\Python\Python312\Lib\site-packages;
C:\Users\25398\AppData\Local\Programs\Python\Python312\DLLs"

当你运行时提示没有叫XX的模块的时候,需要看看是否都包含了,比如刚开始我没有包含C:\Users\25398\AppData\Local\Programs\Python\Python312\DLLs的时候,会报一个没有XX模块的错误,加上之后就不会了。

现在ViewModel中对这些量进行赋值:

image-20241217122302883

这样使用即可:

 using (Py.GIL()){dynamic example = Py.Import("test4");if (SelectedFilePath == null){return;}string image_path = SelectedFilePath;string selected_language = selectedLanguage;string result = example.use_paddleocr(image_path, selected_language);OCRText = result;}

image-20241217122342153

对应的Python代码如下:

import logging
from paddleocr import PaddleOCRdef use_paddleocr(image_path,selected_language):# 配置日志级别为 WARNING,这样 DEBUG 和 INFO 级别的日志信息将被隐藏logging.basicConfig(level=logging.WARNING)# 创建一个自定义的日志处理器,将日志输出到 NullHandler(不输出)class NullHandler(logging.Handler):def emit(self, record):pass# 获取 PaddleOCR 的日志记录器ppocr_logger = logging.getLogger('ppocr')# 移除所有默认的日志处理器for handler in ppocr_logger.handlers[:]:ppocr_logger.removeHandler(handler)# 添加自定义的 NullHandlerppocr_logger.addHandler(NullHandler())ocr = PaddleOCR(use_angle_cls=True, lang=selected_language)  # need to run only once to download and load model into memoryresult = ocr.ocr(image_path, cls=True)result1 = ""for idx in range(len(result)):res = result[idx]   for line in res:            result1 += line[1][0]return result1

实现的效果如下所示:

image-20241217123301884

还遇到的一个坑,就是同步运行没问题,但是改成异步运行,前两次可以,后面就不行了,需要加上这个:

image-20241217123639735

以上就是本次分享的全部内容,全部源代码已上传到GitHub,地址:https://github.com/Ming-jiayou/PaddleOCR-GUI。

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

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

相关文章

在线教育系统厂家电话

为了方便您直接对接相关业务,下面提供几个在线教育相关企业的联系电话,请自行选择合适的服务商联系。若想直接获取更多信息或定制化的产品方案,请拨打以下联系电话:- 顺企网在线教育直播软件开发平台联系人:张生;联系方式:电话 15989102540(说明您来自顺企网,可获得优…

如何解决Git合并冲突?

讲个故事先: 一个晴朗的日子,Alex 把远程版本库的修改拉到他的本地版本库。 他修改了名为 abc.txt 的文件,将其暂存(staged),提交(committed),最后推送(pushed)回远程版本库。 同时,Tina 不知道 Alex 对abc.txt文件的修改,在该文件的 相同区域 做了一些修改,并尝…

MongoDB备份脚本

#!/bin/bash #backup MongoDB #mongodump命令路径 DUMP=/home/mongodb/bin/mongodump #临时备份目录 OUT_DIR=/home/mongodb_bak/mongodb_bak_now #备份存放路径 TAR_DIR=/home/mongodb_bak/mongodb_bak_list #获取当前系统时间 DATE=`date +%Y_%m_%d` #数据库账号 DB_USER=roo…

SQL Server创建用户一直提示用户已存在的解决办法

背景:复制的老数据库,创建账号onlyread时,一直提示数据库里有这个用户名。报错如下:“用户、组或角色onlyread在当前数据库中已存在。”解决方法: 1. 查询数据库,是否有这个用户 -- 查询是否存在指定的用户、组或者角色 SELECT * FROM sys.database_principals WHERE na…

jquery目录树插件

file-explore是一款简单的jquery目录树插件。它使用嵌套的无序列表作为目录树的结构,结合font-awesome图标可以制作出非常漂亮的jquery目录树效果。在线预览 下载使用方法 在页面中引入file-explore.css和font-awesome文件,以及jquery和file-explore.js文件。<link rel=&…

SQL Server的数据库备份与还原

数据库备份分类 备份分类完全备份:(常用方式)备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。 因而,占用不少时间和空间,这种方式不建议太频繁,一般一周一次。差异备份:也叫增量备份。它不使用事务日志,相反,它使用整个数据库的一种新映…

vue-实现组件是否显示还是隐藏

比如我们在home页面需要这个标签在city页面不需要这个标签我们可以在router里面添加meta属性在需要的组件页面导入route实力获取meta属性的值

教育行业办公软件排行榜揭晓!J 人备考该选谁?

在教育领域,高效的办公软件对团队协作和个人学习意义重大。尤其对于 J 人,其偏好秩序与规划,可视化团队协作办公软件能助其在教育教培团队运作和个人公考备考中精准把控进程。本文将盘点 6 款此类软件,助力相关人士做出合适选择。 一、板栗看板 板栗看板是教育办公软件中的…

github克隆代码报错

报错一: git clone https://github.com/PanJiaChen/vue-admin-template.git报错 Cloning into vue-admin-template... fatal: unable to access https://github.com/PanJiaChen/vue-admin-template.git/: Failed to connect to github.com port 443 after 21219 ms: Timed out…

Vulnhub 靶场 DevGuru: 1

前期准备 靶机地址:https://www.vulnhub.com/entry/devguru-1,620/ kali攻击机IP:192.168.11.128 靶机IP:192.168.11.130 一、信息收集 1.使用nmap对目标靶机进行扫描开了 22、80、8585 端口。发现 git 目录,且提示做解析: 192.168.11.130 devguru.local 2. 80 端口发现用…

proxifier 抓取指定客户端软件数据包

背景 想要抓取指定Windows 客户端软件的数据包;过滤掉全局代理的无序数据包。 下载地址 https://www.proxifier.com/ 配置步骤 1. 配置 Proxy Servers2. 代理服务配置 3.Proxification Rules 配置需要监听的小程序,选择上一步配置的代理服务 任务管理器章选择想要抓包的进程…

深度学习一些基础知识

1、过拟合问题 1、数据增强 对图像进行旋转、翻转、裁剪等操作,创造出更多样的数据样本。 2、正则化 凡是能解决模型泛化误差而不是训练误差的方法,都被称为正则化。模型的泛化误差主要是由模型过拟合引起的,所以正则化的各种方法用于解决模型过拟合的问题。 L1和L2正则化:…