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 ...
随机推荐
- 【赵渝强老师】大数据工作流引擎Oozie
一.什么是工作流? 工作流(WorkFlow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.工作流要解决的主要问题是:为实现某 ...
- js模拟二维数组求和
JavaScri实际上没有二维数组的概念,但是由于js变量是松散的,所以能设置数组元素为数组来模拟二维数组,以此类推,可以模拟多维数组. /* 需求:模拟了3 * 3数组求右上三角元素之和1 + 3 ...
- 014 Python 的数据类型(数字、字符串、列表、字典)
#!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/24 20:31 # Filename:014 Python 的数据类型( ...
- 【技术分析】恶意 SPL 代币识别指南
背景 在 EVM 生态上,存在各式各样的 ERC20 代币,因其实现方式有着极高的自由度,也催生了花样繁多的恶意代币.这些恶意代币通常会在代码中实现一些恶意的逻辑(禁止用户卖出,特权铸造或销毁等),其 ...
- day11-基本运算符
运算符 java语言支持如下运算符: 优先级 ( 多敲,多练习 ) 算术运算符:+,-,*,/,%(模运算:取余),++,-- package operator; public class De ...
- 基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
前言 今天大姚给大家分享一款基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用:ZR.Admin.NET. 开源免费(基于MIT License开源协议).代码量少.学习简单. ...
- 云原生周刊:Kubernetes v1.27 发布 | 2023.4.17
开源项目推荐 Palaemon Palaemon 是一个开源开发工具,用于监控 Kubernetes 集群的健康状况和资源指标并分析内存不足 (OOMKill) 错误. Gitkube Gitkube ...
- 云原生周刊 | 在 Grafana 中显示 K8s Service 之间的依赖关系
开源项目推荐 Caretta 这个项目可以在 Grafana 监控面板中显示 K8s Service 之间的依赖关系.底层使用的是 eBPF,对应用无侵入. busuanzi 这是一个基于 Golan ...
- 云原生爱好者周刊:STUNner 助你在 K8s 集群中使用 WebRTC 服务
开源项目推荐 STUNner 目前大多数内网穿透服务都依赖于 STUN 服务或者 TURN 服务,但这些服务大多数都是公用的,即使是私有化部署,也没法迁移到 Kubernetes 的环境中,因为 Ku ...
- 使用 Cursor 和 Devbox 快速开发并上线 Gin 项目
作为开发者,最让我们头疼的事情是什么?那必须是环境配置.版本控制以及各种部署配置等等繁琐的工作. 想象一下,如果你只需点击几下鼠标,就能拥有一个完全配置好的开发环境,支持从 Java 到 Python ...