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

news/2024/12/15 20:17:29/文章来源:https://www.cnblogs.com/o-O-oO/p/18608646

以下文章来源于mingupup的学习记录 ,作者DotNet学习交流

前言

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

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

背景介绍

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

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

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

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

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

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

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;}}});}

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

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

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

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

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

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

相关文章

Derby 数据库介绍(1)--简介

Apache Derby 是 Apache DB 的一个子项目,是一个完全用 Java 实现的开源关系数据库,采用 Apache License 2.0 许可;本文主要介绍其基本概念及安装。 1、Derby 特点 Derby 体积小——基础引擎和嵌入式 JDBC 驱动程序约 3.5MB。Derby 基于 Java、JDBC 和 SQL 标准。Derby 提供…

参数占位符 #{xx} 和 ${xx} 的区别

#{xx} :带有#{}的SQL会采用SQL预编译技术,预编译后的SQL中 #{} 被替换为 “?”,这里的 “?”叫变量占位符,在实际执行SQL时会用“xx”的实际值替换变量占位符,效率更高,可以防止SQL注入SQL预编译:MySQL执行SQL有几个步骤,“查缓存->[语法分析->优化->编译-&…

三文带你轻松上手鸿蒙的 AI 语音 01-实时语音识别

三文带你轻松上手鸿蒙的 AI 语音 01-实时语音识别 前言 HarmonyOSNext中集成了强大的 AI 功能。Core Speech Kit(基础语音服务)是它提供的众多 AI 功能中的一种。 Core Speech Kit(基础语音服务)集成了语音类基础 AI 能力,包括文本转语音(TextToSpeech)及语音识别(Spee…

【原创】ARM64 实时linux操作系xenomai4(EVL)构建安装简述

本文简要记录在瑞芯微RK3588(ARM64)构建安装实时linux操作系统xenomai4的过程,以及实时性测试,希望对你有所帮助!目录0 环境说明1 内核构建2 库编译方式1 交叉编译方式2 本地编译3 测试单元测试hectic:EVL 上下文切换latmus:latency测试4 RK3588 xenomai4实时性能5 总结 本…

最新版chrome如何下载和安装?附安装包

前言 大家好,我是小徐啊。我们在Java开发应用的时候,经常是需要用到浏览器来帮助我们开发的。而浏览器中,谷歌浏览器chrome当属功能最强大的浏览器。今天小徐就来介绍下如何安装chrome。文末附获取方式。 如何安装chrome 首先,双击chrome的安装包,开始安装。然后,可以看到…

[笔记]均分纸牌问题

Index链形均分纸牌每次仅可交换\(1\)张 每次可交换多张环形均分纸牌每次仅可交换\(1\)张 每次可交换多张拓展性很强的贪心问题。或许能推广到树之类的结构上,或者拓展到方案计数问题之类,不过目前还没想好啦。 链形均分纸牌 每次仅可交换\(1\)张 最基础的例题是这样的:有\(n…

掌握PageRank算法核心!你离Google优化高手只差一步!

0 前言 98年前的搜索引擎体验不好:返回结果质量不高:搜索结果不考虑网页质量,而通过时间顺序检索易被钻空:搜索引擎基于检索词检索,页面中检索词出现的频次越高,匹配度越高,这样就会出现网页作弊的情况。有些网页为了增加搜索引擎的排名,故意增加某个检索词频率当时Goo…

ApacheDirectoryStudio如何安装和使用?附安装包

前言 大家好,我是小徐啊。ldap数据库是我们Java开发中,经常会用到的一种数据库。这种数据库是树形结构的,和平常的mysql等数据库还不太一样。但目前对应连接ldap数据库的连接工具比较少,且功能也不强大。今天,小徐就来介绍下一款比较好的连接ldap数据库的连接功能,那就是…

服务器 数据库被攻击如何处理

最近系统有点卡,查看了一下系统事件,发现有人攻击服务器数据库。 以下是我的解决方案 1、修改密码位复杂的密码 2、修改默认数据库默认端口目前已解决下面的腾讯的小哥给的建议,总体差不多一个意思 1、服务器设置大写、小写、特殊字符、数字组成的12-16位的复杂随机密码 ,…

字符数组及应用

这两个等价 长度都为10。这两个等价 长度都为11。如果有:则:注意: 作者QQ4577105

PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息

PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息 本文演示 PyQt5 如何与 Python 的标准库 Logging结合,然后输出日志信息到如:QPlainTextEdit QTextBrowser上 代码结构 本文中全部代码全在test_QPlainTextEdit_Log.py这一个文件中编码,步骤中有变动的…

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

2024-2025-1 20241314 《计算机基础与程序设计》第十二周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标 复习作业正文 正文教材学习内容总结引言与文件概述在《C语…