首页 > 编程语言 >【C#脚本】C#调用Python脚本的方式(一),以PaddleOCR-GUI为例

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

时间:2024-12-15 20:22:14浏览次数:3  
标签:脚本 调用 selectedLanguage 为例 C# PaddleOCR Python

以下文章来源于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获取源码进行实践学习。

标签:脚本,调用,selectedLanguage,为例,C#,PaddleOCR,Python
From: https://www.cnblogs.com/o-O-oO/p/18608646

相关文章

  • 基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout
    1.PCBLayout步骤生成PCB确定PCBlayout规范绘制板框尺寸布局布局规范:按电气性能合理分区,一般分为:数字电路区(即怕干扰、又产生干扰)、模拟电路区(怕干扰)、功率驱动区(干扰源);完成同一功能的电路,应尽量靠近放置,并调整各元器件以保证连线最为简洁;对于质量大的元器......
  • Neo4j - Run a docker container
     zzh@ZZHPC:~$dockerpullneo4j:latest zzh@ZZHPC:~$dockerrun\--publish=7474:7474--publish=7687:7687\--volume=$HOME/neo4j/data:/data\-dneo4j HowtousethisimageYoucanstartaNeo4jcontainerlikethis:dockerrun\......
  • MyBatis 配置中的常见问题:解决 `Unknown DataSource property` 错误
    MyBatis配置中的常见问题:解决UnknownDataSourceproperty错误引言在使用MyBatis进行数据库操作时,配置文件的正确性至关重要。然而,在实际开发中,我们可能会遇到一些配置问题,比如UnknownDataSourceproperty错误。本文将详细分析这一问题的原因,并结合实际案例,帮助大家避......
  • 网站使用CDN出现ttf woff等字体跨域问题解决方案
    如果cdn域名+资源路径是可以通过浏览器url地址栏打开的那么一般是因为nginx配置的原因,找到nginx的配置文件添加以下代码: #允许指定域名访问;location~.*.(eot|ttf|ttc|otf|eot|woff|woff2|svg)(.*){ add_headerAccess-Control-Allow-Originhttp(s)://这里填写你的域名;......
  • HarmonyOS Next V2 @Local 和@Param
    HarmonyOSNextV2@Local和@Param@Local背景@Local是harmony应用开发中的v2版本中对标@State的状态管理修饰器,它解决了@State对状态变量更改的检测混乱的问题:@State修饰的状态变量可以是组件内部自己定义的@State修饰的状态也可以由外部父组件传递这样就导致......
  • C#/.NET/.NET Core 学习、工作、面试指南
    现如今网上关于Java、前端、Android、Golang...等相关技术的学习资料、工作心得、面试指南一搜都是一大把,但是咱们C#/.NET的相关学习资料、工作心得、面试指南都是寥寥无几。我在微信技术群、知乎里面经常会看到这样的提问:有没有好的C#/.NET相关的学习书籍、视频教程、项目框架和......
  • edusrc(自用)
    统一身份认证页面初始账号和密码规律大部分为学号和身份证,社工一下。忘记密码注册页面验证码复用验证码是否可以爆破是否验证手机号真实性(王六/13332231433)前端校验相关文章一般就是code和这个false错误进行的一个前端校验msg也可以修改,但具体作用需要分......
  • 反复出现 idf.py: command not found 的解决办法
    版本:ESP-IDFv4.4.81.问题描述当我们需要经常使用ESP-IDF时,总要反复安装编译链、设置环境,不然就会显示idf.py:commandnotfoundESP-IDF是乐鑫官方的物联网开发框架,适用于ESP32、ESP32-S、ESP32-C和ESP32-H系列SoC。它基于C/C++语言提供了一个自给自足的SDK,方便用户......
  • HarmonyOS Next V2 状态管理 AppStorageV2 和 PersistenceV2
    HarmonyOSNextV2状态管理AppStorageV2和PersistenceV2前言在HarmonyOS应用开发过程中,我们已经学习过了不少关于状态管理相关的技术,如@ObservedV2装饰器和@Trace装饰器:类属性变化观测@ComponentV2装饰器:自定义组件@Local装饰器:组件内部状态@Param:组件外部输入@Once:初......
  • 华为悦盒EC6108V9刷机刷ubuntu以及安装cups驱动惠普1020plus打印机
    买了一台二手惠普HP1020Plus打印机,由于打印机只有USB接口,无法网络打印和苹果手机无线打印,所以考虑接一个打印服务器,实现局域网内的共享打印。打印服务器硬件选择华为悦盒EC6108V9,4核心海思芯片,1+8GB咸鱼20大洋包邮拿下,盒子需要先刷armUbuntu系统。 1、盒子刷机......