C#调用Python脚本的方式(一),以PaddleOCR-GUI为例

embedded/2024/12/27 2:25:23/

前言

每种语言都有每种语言的优势,Python由于其强大的生态,很多任务通过调用包就可以实现,那么学会从C#项目中调用Python脚本完成任务就很重要。C#调用Python代码有多种方式,如果Python那边内容比较多,可以考虑起一个Web Api进行调用,如果只是一个简单的脚本而且不需要频繁调用,那么可以考虑使用Process类创建一个进程来调用,如果有几个方法,并且需要进行数据交互,并可能会频繁调用,那么可以考虑使用pythonnet。

今天依托PaddleOCR-GUI项目,先给大家介绍的是C#调用Python脚本的方式一:使用Process类调用Python脚本。

背景介绍

PaddleOCR是基于PaddlePaddle框架开发的开源文字识别工具,由百度团队维护。它提供了从预处理、文字检测、文字识别到后处理的全流程文字识别解决方案。PaddleOCR不仅性能优异,而且配置灵活、使用便捷,能够满足多种场景下的文字识别需求,广泛应用于广告检测、图像搜索、自动驾驶、内容安全审核等多个领域。

image-20241213190225955

GitHub地址:https://github.com/PaddlePaddle/PaddleOCR

之前也介绍过C#中可以直接使用PaddleSharp进行调用:

C#使用PaddleOCR进行图片文字识别

但是不能指望所有Python的东西都有大佬给你封装好,让你直接调就行。需要离开自己的舒适区,去了解更多其他语言其他生态的内容。

PaddleOCR-GUI只是给PaddleOCR提供了一个简单的使用界面,使用效果如下所示:

image-20241213191129075

image-20241213190922590

GitHub地址:https://github.com/Ming-jiayou/PaddleOCR-GUI

需要先在电脑上搭建PaddleOCR的环境:

Python版本 3.12.8

创建一个Python虚拟环境,在虚拟环境中安装好PaddleOCR,可以参考官网的快速开始:

快速开始 - PaddleOCR 文档

C#调用Python脚本

今天演示的是通过Process类调用Python脚本,与实际项目相结合,需要思考的是如何进行参数的传递呢?比如这里选择的图片路径以及选择的语言。

可以通过命令行参数的方式使用,Python脚本写好如下所示:

python">import sys
import logging
from paddleocr import PaddleOCR# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`# 检查是否有参数传递
if len(sys.argv) > 1:imagePath = sys.argv[1]selectedLanguage = sys.argv[2]
else:print("请提供完整参数")# 配置日志级别为 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=selectedLanguage)  # need to run only once to download and load model into memory
img_path = imagePath
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]   for line in res:print(line[1][0])

需要传递的参数在此处通过命令行的方式传递:

python"># 检查是否有参数传递
if len(sys.argv) > 1:imagePath = sys.argv[1]selectedLanguage = sys.argv[2]
else:print("请提供完整参数")

然后在C#中只需这样使用即可:

  private Task ExecuteOCRCommand(){return Task.Run(() =>{string selectedLanguage;switch (SelectedLanguage){case "中文":selectedLanguage = "ch";break;case "英文":selectedLanguage = "en";break;default:selectedLanguage = "ch";break;}if (PaddleOCRSettingsViewModel.PythonScriptPath == null || PaddleOCRSettingsViewModel.PythonExecutablePath == null){return;}string pythonScriptPath = PaddleOCRSettingsViewModel.PythonScriptPath; // 替换为你的Python脚本路径string pythonExecutablePath = PaddleOCRSettingsViewModel.PythonExecutablePath; // 替换为你的Python解释器路径if (SelectedFilePath == null){return;}string arguments = SelectedFilePath; // 替换为你要传递的参数                                                                                                                                                                         // 创建一个 ProcessStartInfo 实例ProcessStartInfo start = new ProcessStartInfo();start.FileName = pythonExecutablePath;start.Arguments = $"\"{pythonScriptPath}\" {arguments} {selectedLanguage}";start.UseShellExecute = false;start.RedirectStandardOutput = true;start.CreateNoWindow = true;// 创建并启动进程using (Process process = Process.Start(start)){using (System.IO.StreamReader reader = process.StandardOutput){string result = reader.ReadToEnd();OCRText = result;}}});}

需要注意的地方在这几处:

image-20241213192910898

Python解释器路径为虚拟环境中的Python解释器,我这里如下所示:

image-20241213193105587

image-20241213193142433

在此处传入Python脚本路径与设置的参数。

以上就是今天分享的C#调用Python脚本的第一种方式,下期介绍第二种方式,这两种方式在项目中都使用了,感兴趣的朋友,可以从GitHub获取源码进行实践学习。


http://www.ppmy.cn/embedded/145592.html

相关文章

STM32 LL库串口DMA收发初始化

DMA初始化 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); /* UART5_RX Init */LL_DMA_SetChannelSelection(DMA1, LL_DMA_STREAM_0, LL_DMA_CHANNEL_4);LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);LL_DMA_SetStreamP…

uni-app项目无法在Android Studio模拟器上运行

目录 1 问题描述2 尝试解决3 引发原因4 解决方法4.1 换用 MuMu 模拟器 5 结语 1 问题描述 在使用 uni-app 开发 Pad 端 App 时,初始化项目后打算先运行一下确保初始化正常。打开 Android Studio 模拟器后,然后在 HbuilderX 中选择使用 App 标准基座 运…

PCIE概述

PCIE概述 文章目录 PCIE概述前言一、应用场景二、PCIE理论2.1 硬件2.2 拓扑结构:处理器和设备之间的关系2.3 速率2.4 层次接口2.5 四种请求类型2.5.1 bar空间2.5.2 memory2.5.3 IO2.5.4 configuration2.5.5 message 前言 参考链接: pcie总线知识点解析 …

408数据结构:树与二叉树选择题做题笔记

408数据结构 第一章 绪论 第二章 线性表 绪论、线性表选择题做题笔记 第三章 栈、队列和数组 栈、队列和数组选择题做题笔记 第四章 串 第五章 树与二叉树 树与二叉树选择题做题笔记 文章目录 408数据结构第一节 树的基本概念(1)知识点补充(…

Linux 高级路由教程

这本文是一个关于Linux高级路由的教程,主要讨论了如何使用Linux来构建一个能够根据数据包的目的地选择不同链路的路由器。详细解释了如何使用BGP(边界网关协议)来获取国内IP地址的路由信息,并介绍了如何在Linux系统中使用多个路由…

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类,包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数:接受的参数是data_path( 存放数据集的目录…

virtualbox 搭建ubuntu

环境:VirtualBox-6.1.32 1、下载安装virtualbox 略 2、新建ubuntu 3、配置ubuntu 选择虚拟盘 4、安装ubuntu 5、安装ssh sudo apt install openssh-server openssh-client 查看ip 6、安装samba sudo apt install samba 查看ssh启动状态 sudo systemctl stat…

Spring Boot + Spring AI快速体验

Spring AI快速体验 1 什么是Spring AI主要功能 2 快速开始2.1 版本说明2.2 配置文件2.3 pom依赖2.3.1 spring maven仓库2.3.2 核心依赖 2.4 定义ChatClient2.5 启动类2.6 测试 3 参考链接 1 什么是Spring AI Spring AI是Spring的一个子项目,是Spring专门面向于AI的…