C#调用Python代码的方式(二),以PaddleOCR-GUI为例
前言
前面介绍了在C#中使用Progress类调用Python脚本的方法,但是这种方法在需要频繁调用并且需要进行数据交互的场景效果并不好,因此今天分享的是C#调用Python代码的方式(二):使用pythonnet调用Python代码。
pythonnet介绍
Python.NET 是一个包,为 Python 程序员提供了与 .NET 公共语言运行时 (CLR) 几乎无缝的集成,并为 .NET 开发者提供了一个强大的应用程序脚本工具。它允许 Python 代码与 CLR 交互,也可以用于将 Python 嵌入到 .NET 应用程序中。

使用pythonnet,以PaddleOCR-GUI为例
在使用pythonnet之前,需要搞清楚它的三个概念,分别是 Runtime.PythonDLL、PythonEngine.PythonHome、PythonEngine.PythonPath,搞清楚了这些,使用起来就很方便了。

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

我这里对应的路径是:C:\Users\25398\AppData\Local\Programs\Python\Python312\python312.dll。
再来看PythonEngine.PythonHome如何指定。
PythonEngine.PythonHome写你创建的虚拟环境中的python.exe,这里我对应的是:

最后再来看看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中对这些量进行赋值:

这样使用即可:
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;
}

对应的Python代码如下:
import logging
from paddleocr import PaddleOCR
def 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)
# 添加自定义的 NullHandler
ppocr_logger.addHandler(NullHandler())
ocr = PaddleOCR(use_angle_cls=True, lang=selected_language) # need to run only once to download and load model into memory
result = 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
实现的效果如下所示:

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

以上就是本次分享的全部内容,全部源代码已上传到GitHub,地址:https://github.com/Ming-jiayou/PaddleOCR-GUI。
C#调用Python代码的方式(二),以PaddleOCR-GUI为例的更多相关文章
- android开发中调用python代码(带参数)
android开发主要用到的是java代码,但是当开发涉及到一些算法时,往往用python可以提高软件的运行速度,也更加便捷,这里分享自己项目调用python代码的方式,主要有以下几个步骤(个人方法, ...
- java调用python代码
同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- Golang 调用 Python 代码
go 中的 cgo 模块可以让 go 无缝调用 c 或者 c++ 的代码,而 python 本身就是个 c 库,自然也可以由 cgo 直接调用,前提是指定正确的编译条件,如 Python.h 头文件( ...
- 在Java中调用Python代码
极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...
- 小C和小派的缠绵爱情——C语言调用Python代码
我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...
- 『Python CoolBook』C扩展库_其六_从C语言中调用Python代码
点击进入项目 一.C语言运行pyfun的PyObject对象 思路是在C语言中提供实参,传给python函数: 获取py函数对象(PyObject),函数参数(C类型) 获取GIL(PyGILStat ...
- 用一行Python代码制作动态二维码
在GitHub上发现了一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. GitHub网站参见:https://github.c ...
- c#调用python代码
c#调用python的方法比较多,比如ironpython,尽管不用安装python环境,可是不兼容python众多的包,也只更新到了python2,通过创建python进程这种方式可以很好的解决兼容 ...
- 编写高质量的Python代码系列(二)之函数
Python中的函数具备多种特性,这可以简化编程工作.Python函数的某些性质与其他编程语言中的函数相似,但也有性质是Python独有的.本节将介绍如何用函数来表达亿图.提升可复用程度,并减少Bug ...
随机推荐
- Vscode 远程切换Python虚拟环境
在VSCode中远程切换Python虚拟环境是一个涉及多个步骤的过程,包括安装必要的扩展.连接到远程服务器.创建或激活虚拟环境,并在VSCode中选择相应的Python解释器.以下是一个详细的步骤指南 ...
- 暑假集训CSP提高模拟4
A.White and Black 暴力的 \(O(nq)\) 做法比较显然,因为对于根节点来说,只有它自己可以改变自己的颜色,因此如果它是黑色则一定需要更改自己,同时把更改传下去(应该没有那种每次真 ...
- ServiceMesh 2:控制面和数据面的职责(图文总结)
★ ServiceMesh系列 1 Service Mesh介绍 之前的章节我们详细介绍了ServiceMesh的基础知识. ServiceMesh 是最新一代的微服务架构,作为一个基础设施层,能够与 ...
- USB LPM状态
USB的u0.u1.u2和u3代表不同的电源状态或低功耗状态,主要用于USB 3.0及其更高版本,目的是在不活动时减少功耗,同时保证设备能够迅速恢复到工作状态.这些状态的具体作用如下: U0(Acti ...
- 云原生周刊:Kubernetes v1.31 发布
开源项目推荐 Kardinal Kardinal 是一个用于在共享 Kubernetes 集群中创建超轻量级临时开发环境的框架. Anteon Anteon(以前称为 Ddosify)是一个开源的.基 ...
- 5.29 杭州站云原生 Meetup,邀您观看线上同步直播
5 月 15 日在上海组织的云原生 Meetup,除了现场火爆.人数爆满之外,同步进行的线上直播也同样受到了广大社区小伙伴的关注,在线观看直播人数足有千人之众. 为了能让更多的社区小伙伴能够参与到 M ...
- JavaScript 语句后可以省略分号么?
摘自知乎:https://www.zhihu.com/question/20298345 田乐:加与不加是风格问题,风格争议不需要有个定论.关键的问题在于如何"争论",处理好冲突, ...
- sqluldr2linux64.bin命令行下的Oracle数据导出工具
sqluldr2.bin是Oracle数据库下,数据导出的工具 (1)query导出 ./sqluldr2.bin user=用户/密码@主机IP/数据库名 query="select ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(4)
1.问题描述: 目前华为推送API使用的是v2或者v1版本,请问目前最新的鸿蒙next使用v3版本是否兼容v2或者v1,反过来将v2或者v1的api可以推送鸿蒙next的设备吗? 解决方案: v3接口 ...
- c++时间形式转换
https://cplusplus.com/reference/ctime/ 先放上官方文档. ctime类里,有很多转换时间格式的方法,下面只举例将UTC时间,转换为字符串的代码. Unix时间 ...