前言

每种语言都有每种语言的优势,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获取源码进行实践学习。

C#调用Python脚本的方式(一),以PaddleOCR-GUI为例的更多相关文章

  1. (转)java调用python脚本

    这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...

  2. 通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  3. Matlab 调用 Python 脚本

    Matlab 调用 Python 脚本 最近尝试在 Matlab 环境中调用 Python 脚本,这里总结下碰到的几个问题. 1. Python 模块加载 在 Matlab 函数中,想要将 Pytho ...

  4. java调用python脚本 并传参(根据配置文件获取python文件地址)

    方式一: Java代码 package com.mybatis.plus.utils; import cn.hutool.core.lang.Console; import java.io.Buffe ...

  5. linux+php+apache web调用python脚本权限问题解决方案

    lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...

  6. linux+php+apache web调用python脚本权限问题

    lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...

  7. PHP 调用Python脚本

    上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apac ...

  8. C++中调用Python脚本

    C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...

  9. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  10. Window环境下,PHP调用Python脚本

    参考 php调用python脚本*** php 调用 python脚本的方法 解决办法:php提供了许多调用其他脚本或程序的方法,比如exec/system/popen/proc_open/passt ...

随机推荐

  1. Linux工具:Winscp显示隐藏的文件

    事件起因: 需要用Winscp上传文件到服务器,然后发现文件被隐藏了 解决办法: Winscp软件的快捷键 : Ctrl + Alt + HWindscp软件的设置方法: 菜单栏 选项 -> 面 ...

  2. “全栈合一 智慧运维”智和网管平台SugarNMS V9版本发布

    以"管控万物 无所不能 无处不"在为产品创新理念,智和信通打造"全栈式"网络安全运维平台-智和网管平台SugarNMS.立足数字化.智能化.可视化.自动化,整合 ...

  3. TEN Framework 入坑记

    TL;DR TEN Framework 最初叫 Astra,后改为 TEN,即 Transformative Extensions Network. 我第一次见到 TEN (那时还叫 Astra)是在 ...

  4. USB协议详解第7讲(补充-USB帧和微帧剖析)

    1.概念 (1)USB2.0帧和微帧属于物理层时间基准的概念,低速和全速下每个帧时长为1ms,高速下每个帧又分为8个微帧,即每个微帧时长为125us. (2)USB主机和设备控制器同步后,每个微帧起始 ...

  5. USB编码方式(NRZI)及时钟同步方式

    1.概述 在同步通讯系统中,两个设备通讯则需要同步信号,同步信号分为时钟同步信号和自同步信号两种,时钟同步方式在通讯链路上具有时钟信号(IIC.SPI),自同步方式在通讯链路中没有同步信号(PCIE. ...

  6. Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。

    通过Java日期时间API系列1-----Jdk7及以前的日期时间类中得知,Java8以前除了java.sql.Timestamp扩充纳秒,其他类最大只精确到毫秒:Java8 time包所有相关类都支 ...

  7. 6.flask 源码解析:响应

    目录 一.flask 源码解析:响应 1.1 response 简介 1.2 flask 响应(response) 1.3 werkzeug response 1.4 自定义 response Fla ...

  8. 超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时

    > 作者:尹珉,KubeSphere Ambassado,rKubeSphere Contributor,KubeSphere 社区用户委员会杭州站站长. 踏上 Containerd 技术之旅 ...

  9. KubeSphere DevOps 流水线入门指南

    作者:赵海亮,浙江大学计算机专业四年级在读博士生,研究方向为云计算.边缘计算.分布式系统等. 虽然 KubeSphere 能够将我们从 yaml 文件的编写中解放出来,但是项目上云仍然十分繁琐. 此外 ...

  10. OGRE 渲染引擎 Windows 平台构建及编译

    0 OGRE 机器人领域常见的Rviz和Gazebo可视化的渲染后端. 1 无数的坑 这东西真的可恶,官方教程文档以及项目构建的方式是真的繁琐,在Windows上. CMake 的构建必须要使用 CM ...