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

news/2025/3/10 15:29:06/文章来源:https://www.cnblogs.com/mingupupu/p/18605737

前言

每种语言都有每种语言的优势,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脚本写好如下所示:

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])

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

# 检查是否有参数传递
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.hqwc.cn/news/852069.html

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

相关文章

sFlow虚拟机流量监控

实验-sFlow流量监控 本实验需要准备两个虚拟机:Mininet虚拟机:需要安装Mininet,用来创建topo产生流量。 sFlow虚拟机:需要安装sFlow,用来监控Mininet虚拟机中的topo中产生的流量。实验基本流程介绍:准备两台Ubuntu虚拟机,一台安装Mininet,一台安装sFlow 在Mininet虚拟机…

八、ArkTS-语句-类型进阶与渲染控制

1.对象数组 1.1定义对象数组 它是一个自定义对象类型的数组,数组元素是自己定义对象类型的对象,就是数组元素是对象,数组类型是自定义对象的类型//第一步通过接口定义对象 interface student{stuID:number,name:string,gender:string,age:number }//基于接口创建对象数组 le…

在CodeBolcks+Windows API下的C++编程教程——给你的项目中添加资源文件和图标

0.前言 我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。 了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:…

20222402 2024-2025-2 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1本周学习内容 网络攻击基本模式 ①截获 嗅探 监听 ②篡改 数据包篡改 ③中断 拒绝服务 ④伪造 欺骗 IP 源地址欺骗: 伪造具有虚假源地址的 IP 数据包进行发送√目的:隐藏攻击者身份、假冒其他计算机通过身份验证 1.2实验内容及要求 本实践的目标理解常用网络欺诈…

转载:【AI系统】LLVM IR 基本概念

在上一篇文章中,我们已经简要介绍了 LLVM 的基本概念和架构,我们现在将更深入地研究 LLVM 的 IR(中间表示)的概念。 了解 LLVM IR 的重要性是为了能够更好地理解编译器的运作原理,以及在编译过程中 IR 是如何被使用的。LLVM IR 提供了一种抽象程度适中的表示形式,同时能够…

转载:【AI系统】AI 框架基础介绍

什么是 AI 算法?什么是神经网络?神经网络有什么用?为什么神经网络需要训练?什么是模型?AI 框架有什么用?AI 框架能解决什么问题? 上面的几个问题其实还挺有挑战的,也是本文需要回答的一个问题。下面来对一些基础概念进程澄清:首先深度学习是机器学习研究领域中的一种范…

转载:【AI系统】谷歌 TPU v1-脉动阵列

本文深入探讨了谷歌 TPU v1 的架构和设计原理。我们将解析 TPU v1 芯片的关键元素,包括 DDR3 DRAM、矩阵乘法单元(MXU)、累加器和控制指令单元。重点介绍脉动阵列(Systolic Array)的工作原理,它是 TPU 的核心,通过数据的流水线式处理实现高效的矩阵乘法计算。此外,我们…

GitLab安装使用

GitLab安装GitLab的安装 1. 环境配置 关闭防火墙和selinux [root@gitlab ~]# systemctl stop firewalld [root@gitlab ~]# systemctl disable firewalld Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service". Removed "/etc/systemd/syst…

2024-2025-1 20241401 《计算机基础与程序设计》 第十二周学习总结

班级链接 2024计算机基础与程序设计作业要求 第十二周作业教材学习内容总结 《C语言程序设计》第11章指针与一维数组间的关系: 指针和一维数组之间的联系,包括如何使用指针访问数组元素等。 指针与二维数组间的关系: 指针与二维数组交互的方式,以及相关的访问方法。 指针数…

转载:【AI系统】编译器基础介绍

随着深度学习的不断发展,AI 模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对 AI 框架的持续迭代。AI 编译器就成了应对以上问题广受关注的技术方向,让用户仅需专注于上层模型开发,降…

转载:【AI系统】昇腾 AI 处理器

本文将会介绍华为昇腾 AI 处理器的架构与卷积加速原理。昇腾 AI 处理器是华为基于达芬奇架构专为AI计算加速而设计的处理器,它支持云边端一体化的全栈全场景解决方案,具有高能效比和强大的 3D Cube 矩阵计算单元,支持多种计算模式和混合精度计算。 昇腾 AI 处理器的架构包括…