C#调用python代码

共尝试了三种方式,1.2引用了以下三个

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using Python.Runtime;
Python.Runtime需要是 .net standard 类库   我用的是.net6

 

1.没有引用第三方的时候可以, 引用第三方就会找不到第三方 例如 找不到import的paddleocr

  ScriptRuntime pyRuntime = IronPython.Hosting.Python.CreateRuntime();
  dynamic obj = pyRuntime.UseFile(@"D:\Develop\TEST\OCR\OCRdemo.py");
  dynamic dy = obj.my_ocr(@"C:\Users\Thinkpad\Pictures\0\258.jpg");
  Console.WriteLine(dy.ToString());

  猜测大概等同于下面这种其他人的方式(未验证)

复制代码
ScriptEngine pyEngine = Python.CreateEngine();//创建Python解释器对象
            dynamic py = pyEngine.ExecuteFile(@"test.py");//读取脚本文件
            int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
            string reStr = py.main(array);//调用脚本文件中对应的函数
            Console.WriteLine(reStr);
        Console.ReadKey();

————————————————
版权声明:本文为CSDN博主「人工智能之浪潮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mago2015/article/details/119450865

复制代码

 

2.这种方式可以把py文件的内容运行出来,分为两种(同步获取和异步回调两种方式)

  2.1、同步 

复制代码
  Process p = new Process();
    //环境安装路径 (已经配置了系统变量指向了paddle38,所以可以直接写python.exe)
    p.StartInfo.FileName = @"python.exe";
    //dll+空格+参数
    p.StartInfo.Arguments = @"D:\Develop\TEST\OCR\OCRdemo.py C:\Users\Thinkpad\Pictures\0\258.jpg";//参数以空格分隔,如果某个参数为空,可以传入””
    p.StartInfo.UseShellExecute = false; //必需
    p.StartInfo.RedirectStandardOutput = true;//输出参数设定
    p.StartInfo.RedirectStandardInput = true;//传入参数设定
    p.StartInfo.CreateNoWindow = true;
    p.Start();
    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();//关键,等待外部程序退出后才能往下执行}
    Console.Write(output);//输出
    p.Close(); //txt1.Text = output;
复制代码

   备注:传参方式 直接空格接在文件名后面,python里接参数要写 例如:sys.args[1]  以下是python代码

复制代码
from paddleocr import PaddleOCR
import sys

def my_ocr(img_path):
ocr = PaddleOCR(lang=‘ch’)
result = ocr.ocr(img_path)
for line in result:
print(line)
return result

if name == ‘main’:
# print(len(sys.argv))
if len(sys.argv) > 1 :
arg1 = sys.argv[1]
else:
arg1 = r‘C:\Users\Thinkpad\Pictures\0\259.jpg’
r1 = my_ocr(arg1)
# for line in r1:
# print(line)
print(“main ok”)
# pass

复制代码

 

  2.2、异步回调

复制代码
public static void function2()
        {
            Process p = new Process();
            //string path = "OCRdemo.py";//待处理python文件的路径,本例中放在debug文件夹下
            string sArguments = @"D:\Develop\TEST\OCR\OCRdemo.py";
            string[] strArr = new string[1];
            strArr[0] = @"C:\Users\Thinkpad\Pictures\0\258.jpg";
            foreach (var sigstr in strArr)//添加参数
            {
                sArguments += " " + sigstr;
            }
        p.StartInfo.FileName </span>= <span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">python.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span>;  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">python2.7的安装路径</span>
        p.StartInfo.Arguments = sArguments;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">python命令的参数</span>
        p.StartInfo.UseShellExecute = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
        p.StartInfo.RedirectStandardOutput </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        p.StartInfo.RedirectStandardInput </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        p.StartInfo.RedirectStandardError </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        p.StartInfo.CreateNoWindow </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        p.Start();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">启动进程</span>

p.BeginOutputReadLine();
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
//Console.ReadLine();
p.WaitForExit();
}
private static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
Console.WriteLine(e.Data); //此处在控制台输出.py文件print的结果
}
}

复制代码

  py文件可以放在任意路径。

  3.这种 我电脑暂时没运行出来

复制代码
    PythonEngine.Initialize();
    var pyThread = PythonEngine.BeginAllowThreads();
    var pyLock = PythonEngine.AcquireLock(); //多线程调用,先锁定线程,最后再释放线程 功能同using (Py.GIL()){}
    Console.WriteLine("开启线程,锁定线程");
    //using (Py.GIL()) //Initialize the Python engine and acquire the interpreter lock
    //{
    // import your script into the process
    dynamic AL = Py.Import("test1");//python脚本文件名
    string image_path = @"C:\Users\Thinkpad\Pictures\0\258.jpg";
    AL.main(image_path);
    Console.WriteLine("执行测试图片后多线程无报错"); 
复制代码

 最终,第三种方式未继续研究,这些文章对之后可能有帮助,先记下来 《

C#调用PYD

》 https://www.freesion.com/article/71281350870/ 

备注给自己: 本文是为了C#调用百度飞桨OCR识别搭建的临时环境,用了anaconda集成了python3.9。 过程中比较着重的参考了以下文章:

paddleocr:python脚本使用 

https://blog.csdn.net/wss794/article/details/122476110

windows10通过anaconda安装paddle和paddleOCR并将图片转为excel 

https://blog.csdn.net/qq_39898066/article/details/123553021?utm_source=app&app_version=5.2.0

深度学习Python环境打包到另外一台电脑(详细教程)

https://blog.csdn.net/excelNo1/article/details/117733718

C#调用Python3(在VisualStudio2022中基于.NET6.0框架调用Py。。。

https://wenku.baidu.com/view/2c8453e08aeb172ded630b1c59eef8c75fbf9587.html

C#调用python脚本并传递参数的一种方法

https://wenku.baidu.com/view/40d6f8840329bd64783e0912a216147917117e7b.html

这个也该和我的差不多 

https://blog.csdn.net/ShyLoneGirl/article/details/114171320 

 

以上1.2的方式适用于比较简单的测试,后面我又研究了一下把python代码打包成库的方式,这种比较实用,可以直接调用py内部函数方法,就是文中的3. 成果如下:

https://www.cnblogs.com/luosiqizi/p/16543898.html

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值