一、简介
IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python是一种解释型脚本语言,可以应用于以下领域:
● 科学计算和统计
● 人工智能
● 桌面界面开发
● 软件开发
● 后端开发
● 网络爬虫
二、创建 C# 项目
新建一个 Winform 项目 CSharpCallPython
为了更方便的看到控制台打印的效果,在 项目属性 --> 应用程序 将输出类型改为控制台输出
三、C# 调用 Python
1.IronPython 插件
在 NuGet 中安装 IronPython 插件
在项目的 Debug 目录下添加一个 Python 脚本 test.py ,
在 test.py 中添加下面的代码:
def sayHi(): print("f**k you") def add(x,y): try: return x + y except Exception as err: return str(err) def arrSum(arr): try: sum = 0 for i in arr: sum += i return sum except Exception as err: return str(err)
此时,Python 的工作就完成了,接下来我们继续完成 C# 剩余的逻辑。
winform 界面只需要添加一个按钮即可
Form1 代码:
using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System; using System.Windows.Forms; namespace CSharpCallPython { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private string PythonScriptPath = string.Empty; private ScriptEngine PyEngine = null; private void Form1_Load(object sender, EventArgs e) { PythonScriptPath = Application.StartupPath + "\\test.py"; PyEngine = Python.CreateEngine(); } private void button1_Click(object sender, EventArgs e) { dynamic py = PyEngine.ExecuteFile(PythonScriptPath); py.sayHi(); var sum = py.add(3, 5); Console.WriteLine("add 方法的和是:{0}", sum); int[] arr = new int[3] { 2, 4, 6 }; var sum1 = py.arrSum(arr); Console.WriteLine("数组的和是:{0}", sum1); } } }
运行后,点击按钮后效果:
2.调用 Python.exe 程序执行
调用 python.exe 文件执行后,由 exe 文件返回执行结果,需要安装 python,下面的代码我试了几次,根本没有效果,返回值都是null,可能是个人配置出了问题,这里就展示一下吧。
C# 代码参考:
Process p = new Process(); //环境安装路径 (已经配置了系统变量,所以可以直接写python.exe) p.StartInfo.FileName = @"python.exe"; //dll+空格+参数 p.StartInfo.Arguments = @"D:\Develop\TEST\OCR\OCRdemo.py 2 3";//参数以空格分隔,如果某个参数为空,可以传入”” 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();
另外,还有其他的一些调用的方式,比如使用 c++ 程序调用 python文件,然后将其做成动态链接库(dll),在 C# 中调用此dll文件,这种方式很复杂,并且受 python 版本、(python/vs)32/64位影响,而且要求用户必须安装python运行环境。