当前位置:   article > 正文

C#调用python脚本_c# 调用py脚本

c# 调用py脚本

        在平常工程项目开发过程中常常会涉及到机器学习、深度学习算法方面的开发任务,但是受限于程序设计语言本身的应用特点,该类智能算法的开发任务常常使用Python语言开发,所以在工程实践过程中常常会遇到多平台程序部署问题。本文总结了C#调用Python程序的各种方法,希望能够给各位读者提供一定的参考。

方式一:使用c#,nuget管理包上下载的ironPython安装包适用于python脚本中不包含第三方模块的情况

IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。它的诞生是为了将更多的动态语音移植到NET Framework上。

  1. using IronPython.Hosting;
  2. using Microsoft.Scripting.Hosting;
  3. using System;
  4. namespace CSharpCallPython
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. ScriptEngine pyEngine = Python.CreateEngine();//创建Python解释器对象
  11. dynamic py = pyEngine.ExecuteFile(@"test.py");//读取脚本文件
  12. int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
  13. string reStr = py.main(array);//调用脚本文件中对应的函数
  14. Console.WriteLine(reStr);
  15. Console.ReadKey();
  16. }
  17. }
  18. }
  1. def main(arr):
  2. try:
  3. arr = set(arr)
  4. arr = sorted(arr)
  5. arr = arr[0:]
  6. return str(arr)
  7. except Exception as err:
  8. return str(err)

方式二:适用于python脚本中包含第三方模块的情况(与第四种类似)

  1. using System;
  2. using System.Collections;
  3. using System.Diagnostics;
  4. namespace Test
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. Process p = new Process();
  11. string path = "reset_ipc.py";//待处理python文件的路径,本例中放在debug文件夹下
  12. string sArguments = path;
  13. ArrayList arrayList = new ArrayList();
  14. arrayList.Add("com4");
  15. arrayList.Add(57600);
  16. arrayList.Add("password");
  17. foreach (var param in arrayList)//添加参数
  18. {
  19. sArguments += " " + sigstr;
  20. }
  21. p.StartInfo.FileName = @"D:\Python2\python.exe"; //python2.7的安装路径
  22. p.StartInfo.Arguments = sArguments;//python命令的参数
  23. p.StartInfo.UseShellExecute = false;
  24. p.StartInfo.RedirectStandardOutput = true;
  25. p.StartInfo.RedirectStandardInput = true;
  26. p.StartInfo.RedirectStandardError = true;
  27. p.StartInfo.CreateNoWindow = true;
  28. p.Start();//启动进程
  29. Console.WriteLine("执行完毕!");
  30. Console.ReadKey();
  31. }
  32. }
  33. }

Python代码

  1. # -*- coding: UTF-8 -*-
  2. import serial
  3. import time
  4. def resetIPC(com, baudrate, password, timeout=0.5):
  5. ser=serial.Serial(com, baudrate, timeout=timeout)
  6. flag=True
  7. try:
  8. ser.close()
  9. ser.open()
  10. ser.write("\n".encode("utf-8"))
  11. time.sleep(1)
  12. ser.write("root\n".encode("utf-8"))
  13. time.sleep(1)
  14. passwordStr="%s\n" % password
  15. ser.write(passwordStr.encode("utf-8"))
  16. time.sleep(1)
  17. ser.write("killall -9 xxx\n".encode("utf-8"))
  18. time.sleep(1)
  19. ser.write("rm /etc/xxx/xxx_user.*\n".encode("utf-8"))
  20. time.sleep(1)
  21. ser.write("reboot\n".encode("utf-8"))
  22. time.sleep(1)
  23. except Exception:
  24. flag=False
  25. finally:
  26. ser.close()
  27. return flag
  28. resetIPC(sys.argv[1], sys.argv[2], sys.argv[3])

方式三、使用c++程序调用python文件,然后将其做成动态链接库(dll),在c#中调用此dll文件
     限制:实现方式很复杂,并且受python版本、(python/vs)32/64位影响,而且要求用户必须安装python运行环境

方式四、使用安装好的python环境,利用c#命令行,调用.py文件执行(推荐使用)

      优点:执行速度只比在python本身环境中慢一点,步骤也相对简单

      缺点:需要用户安装配置python环境

      实用步骤:

      1、下载安装python,并配置好环境变量等(本人用的Anaconda,链接此处不再提供)

       2、编写python文件(这里为了便于理解,只传比较简单的两个参数)

  1. #main.py
  2. import numpy as np
  3. import multi
  4. import sys
  5. def func(a,b):
  6. result=np.sqrt(multi.multiplication(int(a),int(b)))
  7. return result
  8. if __name__ == '__main__':
  9. print(func(sys.argv[1],sys.argv[2]))

        3、在c#中调用上述主python文件:main.py

  1. private void Button_Click(object sender, RoutedEventArgs e)
  2. {
  3. string[] strArr=new string[2];//参数列表
  4. string sArguments = @"main.py";//这里是python的文件名字
  5. strArr[0] = "2";
  6. strArr[1] = "3";
  7. RunPythonScript(sArguments, "-u", strArr);
  8. }
  9. //调用python核心代码
  10. public static void RunPythonScript(string sArgName, string args = "", params string[] teps)
  11. {
  12. Process p = new Process();
  13. string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
  14. path = @"C:\Users\user\Desktop\test\"+sArgName;//(因为我没放debug下,所以直接写的绝对路径,替换掉上面的路径了)
  15. p.StartInfo.FileName = @"D:\Python\envs\python3\python.exe";//没有配环境变量的话,可以像我这样写python.exe的绝对路径。如果配了,直接写"python.exe"即可
  16. string sArguments = path;
  17. foreach (string sigstr in teps)
  18. {
  19. sArguments += " " + sigstr;//传递参数
  20. }
  21. sArguments += " " + args;
  22. p.StartInfo.Arguments = sArguments;
  23. p.StartInfo.UseShellExecute = false;
  24. p.StartInfo.RedirectStandardOutput = true;
  25. p.StartInfo.RedirectStandardInput = true;
  26. p.StartInfo.RedirectStandardError = true;
  27. p.StartInfo.CreateNoWindow = true;
  28. p.Start();
  29. p.BeginOutputReadLine();
  30. p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
  31. Console.ReadLine();
  32. p.WaitForExit();
  33. }
  34. //输出打印的信息
  35. static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
  36. {
  37. if (!string.IsNullOrEmpty(e.Data))
  38. {
  39. AppendText(e.Data + Environment.NewLine);
  40. }
  41. }
  42. public delegate void AppendTextCallback(string text);
  43. public static void AppendText(string text)
  44. {
  45. Console.WriteLine(text); //此处在控制台输出.py文件print的结果
  46. }

 

方式五、c#调用python可执行exe文件,使用命令行进行传参取返回值

      优点:无需安装python运行环境

      缺点:

       1、可能是因为要展开exe中包含的python环境,执行速度相当慢,慎用!

       2、因为是命令行传参形式,故传参需要自行处理。ps:由于命令行传参形式为:xxx.exe 参数1 参数2 参数3....

使用步骤:

1、使用pyinstaller打包python程序;

2、在c#中调用此exe文件;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/478551
推荐阅读
相关标签
  

闽ICP备14008679号