如何在C#中直接运行Python脚本(无需Process与Cmd)
在C#中直接运行依赖EasyOCR/OpenCV/PyODBC的Python脚本(基于Python.Runtime)
IronPython无法兼容EasyOCR这类依赖CPython C扩展的库,所以唯一可行的方案是Python.Runtime,以下是完整实现步骤和代码:
一、环境准备
- 安装CPython 3.8~3.10版本,执行命令安装依赖:
pip install easyocr opencv-python pyodbc - 在C#项目中安装
Python.RuntimeNuGet包(确保版本与你的Python大版本匹配,比如Python3.9对应Python.Runtime 3.9.x)
二、项目配置
- 右键C#项目 → 属性 → 生成 → 取消勾选「首选32位」(如果你的Python是64位版本)
- 确保Python安装目录已加入系统
PATH环境变量,或者在代码中手动指定路径
三、代码实现
1. Python脚本示例(命名为ocr_db_script.py)
import easyocr import cv2 import pyodbc import sys # 若出现模块找不到的问题,手动添加site-packages路径 # sys.path.append("C:/Python39/Lib/site-packages") def process_image_and_save(image_path, db_connection_str): # 1. EasyOCR识别文字 reader = easyocr.Reader(['ch_sim', 'en']) result = reader.readtext(image_path) ocr_text = '\n'.join([f"{text}" for (bbox, text, prob) in result]) # 2. OpenCV简单处理(示例:转灰度图) img = cv2.imread(image_path) gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray_save_path = image_path.replace('.', '_gray.') cv2.imwrite(gray_save_path, gray_img) # 3. PyODBC写入数据库 conn = pyodbc.connect(db_connection_str) cursor = conn.cursor() # 确保数据库表已存在:CREATE TABLE ocr_results (id INT IDENTITY(1,1) PRIMARY KEY, image_path NVARCHAR(255), ocr_text NVARCHAR(MAX)) cursor.execute("INSERT INTO ocr_results (image_path, ocr_text) VALUES (?, ?)", (image_path, ocr_text)) conn.commit() conn.close() return { 'ocr_text': ocr_text, 'gray_image_path': gray_save_path, 'status': 'success' }
2. C#调用代码
using System; using Python.Runtime; namespace PythonIntegrationDemo { class Program { static void Main(string[] args) { // 初始化Python.Runtime var pythonHome = @"C:\Python39"; // 替换为你的Python安装路径 var pythonLib = $@"{pythonHome}\Lib\site-packages"; Environment.SetEnvironmentVariable("PYTHONHOME", pythonHome); Environment.SetEnvironmentVariable("PYTHONPATH", pythonLib); PythonEngine.Initialize(); try { using (Py.GIL()) // 获取全局解释器锁,必须加 { // 加载Python脚本 dynamic script = Py.Import("ocr_db_script"); // 定义参数 string imagePath = @"C:\test_image.jpg"; // 替换为你的测试图片路径 string dbConnStr = @"Driver={SQL Server};Server=.\SQLEXPRESS;Database=TestDB;Trusted_Connection=True;"; // 替换为你的数据库连接串 // 调用Python函数 dynamic result = script.process_image_and_save(imagePath, dbConnStr); // 处理返回结果 Console.WriteLine("OCR识别结果:"); Console.WriteLine(result.ocr_text); Console.WriteLine($"灰度图已保存至: {result.gray_image_path}"); } } catch (Exception ex) { Console.WriteLine($"执行出错: {ex.Message}"); // 捕获Python异常并打印详情 if (ex is PythonException pyEx) { Console.WriteLine($"Python异常栈信息: {pyEx.StackTrace}"); } } finally { PythonEngine.Shutdown(); } } } }
四、常见问题排查
- 提示「找不到模块」:检查
PYTHONPATH是否包含Python的site-packages目录,或在Python脚本开头用sys.path.append手动添加 - 初始化失败:确保Python版本与Python.Runtime版本匹配,项目平台(x64/x86)与Python一致
- 数据库连接失败:检查PyODBC驱动是否安装,连接串格式是否正确
- EasyOCR首次运行慢:首次执行会下载预训练模型,后续会缓存,可提前手动下载模型到指定目录
内容的提问来源于stack exchange,提问作者user1498247
相关产品推荐
相关产品推荐

