百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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

off999 2024-12-28 14:42 12 浏览 0 评论

前言

每种语言都有每种语言的优势,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)

# 创建一个自定义的日志处理器,将日志输出到 Handler(不输出)
class Handler(logging.Handler):
def emit(self, record):
pass

# 获取 PaddleOCR 的日志记录器
ppocr_logger = logging.getLogger('ppocr')

# 移除所有默认的日志处理器
for handler in ppocr_logger.handlers[:]:
ppocr_logger.removeHandler(handler)

# 添加自定义的 Handler
ppocr_logger.addHandler(Handler())

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 == || PaddleOCRSettingsViewModel.PythonExecutablePath == )
{
return;
}
string pythonScriptPath = PaddleOCRSettingsViewModel.PythonScriptPath; // 替换为你的Python脚本路径
string pythonExecutablePath = PaddleOCRSettingsViewModel.PythonExecutablePath; // 替换为你的Python解释器路径

if (SelectedFilePath == )
{
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获取源码进行实践学习。

相关推荐

还不会deepseek部署到本地?这篇教程手把手教会你

一、为什么要把DeepSeek部署到本地?新手必看的前置知识近期很多读者在后台询问AI工具本地部署的问题,今天以国产优质模型DeepSeek为例,手把手教你实现本地化部署。本地部署有三大优势:数据隐私...

推荐个超实用的Python标准库pathlib,玩转路径操作

pathlib学习Python时,尤其是在进行文件操作和数据处理时,经常会处理路径问题。最常用和常见的是os.path模块,它将路径当做字符串进行处理,如果使用不当可能导致难以察觉的错误,而且...

python中文件读写操作最佳实践——使用 os.path 进行路径操作

在Python中处理文件路径时,使用os.path模块比直接使用字符串拼接更加安全、可靠且跨平台。下面我将详细解释为什么以及如何使用os.path进行路径操作。为什么不应该使用字符串拼接?#不推荐的...

Python如何获取当前文件所在目录的完整路径

在编程的过程中,我们常常会遇到需要获取当前文件所在目录完整路径的需求。那具体该怎么做呢?这是在众多开发者群体中备受关注的一个问题,就像在问答平台上“/questions/3430372/how-d...

python编程之神经网络篇(python的神经网络编程)

#头条创作挑战赛#神经网络发展到今天大致经历了2次兴起和2次衰落,1943年心理学家McCulloch(麦卡洛克)和数学家Pitts(皮茨)参考生物神经系统的工作原理,首次提出建立了MP神经元模型。其...

详解Python整数类型的按位运算(在python中整数)

在Python编程中,按位运算是直接对整数的二进制位进行操作的底层运算,虽然不如逻辑运算常见,但在处理位掩码、状态标志、底层算法优化等场景中至关重要。本文将从基础概念到高级应用,全面解析Python整...

强化学习的改进只是「噪音」?最新预警:冷静看待推理模型进展

机器之心报道编辑:蛋酱、+0「推理」已成为语言模型的下一个主要前沿领域,近期学术界和工业界都取得了突飞猛进的进展。在探索的过程中,一个核心的议题是:对于模型推理性能的提升来说,什么有效?什么无效?De...

了解python3新特性-3(python3介绍)

以下是Python3的其他一些特性:改进了asyncio.run():Python3.7中对asyncio.run()函数进行了改进,可以方便地处理异步任务异常。新增了typing....

python GIL全局解释器锁原理、功能及应用示例

GIL(GlobalInterpreterLock)是Python解释器中的一个机制,它是一把全局锁,用于在同一时间内限制只有一个线程执行Python字节码。以下是GIL的原理、功能以及5个示例:...

python3-运算符优先级(python语言运算符优先级)

#挑战30天在头条写日记#Python运算符优先级以下列出了从最高到最低优先级的所有运算符,相同单元格内的运算符具有相同优先级。运算符均指二元运算,除非特别指出。相同单元格内的运算符从左至右分组...

如何在 Python 中使用 Notion API?

如何在Python中使用NotionAPI并自动编辑数据库。设置NotionAPI和数据库首先,让我们在Notion板中创建一个完整的页面数据库。在本文中,我使用了一个来自我的一个数据库的真实示...

一文了解 Python 的临时文件模块(python tmpfile)

Python的Tempfile模块是用于创建临时文件和文件夹的标准库。当我们需要临时存储数据时,可以创建临时文件,这些文件位于单独的目录中,该目录因操作系统而异,并且这些文件的名称是唯一的。在...

一文带您精通Python 集合(Set):8个不可不知的技巧及示例

在Python中,集合(Set)与列表(List)、字典(Dict)、元组(Tuple)一起构成了基本的数据结构。集合以其独特的无序性和元素唯一性,在处理数据时具有独特的优势。然而,很多人对集合的...

数据类型的"变形记":解锁Python数据处理效率的关键钥匙

在日常编程中,数据就像流动的河水,而数据类型就是塑造河道的模具。当我们从用户输入、文件读取或网络请求中获取数据时,往往需要像侦探一样验证它们的真实身份,再像魔术师一样将它们转换成需要的形态。这就是数据...

大学 Python 程序设计实验报告:基于组合数据类型

一、实验目的编写Python程序,实现对简单文本的处理,掌握列表、元组、字典等组合类型的应用。二、实验要求掌握字符串的输入和输出。掌握使用切片的方式访问字符串中的值。掌握常见的字符串内建函数的应用。...

取消回复欢迎 发表评论: