C#使用IronPython库调用Python脚本
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎。
IronPython的主页: IronPython.net /
github站点:
方式一:适用于python脚本中不包含第三方模块的情况
1、执行语句
借由IronPython,就可以利用.NET执行存储在Python脚本中的代码段。下面通过简单的示例说明如何应用C#调用Python脚本。
1、在VS中新建窗体项目:IronPythonDemo
2、VS的菜单中打开“Nuget程序包管理器”
3、搜索IronPython程序包并安装
安装后自动引用如下的DLL
4、在exe程序所在文件夹下创建Python脚本。Python示例脚本实现求两个数的四则运算:
1 2 3 4 5 6 7 8 9 10 11 | num1 = arg1 num2 = arg2 op = arg3 if op = = 1 : result = num1 + num2 elif op = = 2 : result = num1 - num2 elif op = = 3 : result = num1 * num2 else : result = num1 * 1.0 / num2 |
设置IronPythonDemo.py文件属性为“复制到输出目录”
5、修改工程的配置文件App.config如下:
其中microsoft.scripting节点中设置了IronPython语言引擎的几个属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <? xml version = "1.0" encoding = "utf-8" ?> < configuration > < configSections > < section name = "microsoft.scripting" type = "Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting" /> </ configSections > < microsoft.scripting > < languages > < language names = "IronPython;Python;py" extensions = ".py" displayName = "Python" type = "IronPython.Runtime.PythonContext, IronPython" /> </ languages > </ microsoft.scripting > < startup > < supportedRuntime version = "v4.0" sku = ".NETFramework,Version=v4.5" /> </ startup > </ configuration > |
6、 绘制窗体如下:
7、编写计算的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ScriptRuntime scriptRuntime = ScriptRuntime.CreateFromConfiguration(); ScriptEngine pyEngine = scriptRuntime.GetEngine( "python" ); ScriptSource source = pyEngine.CreateScriptSourceFromFile( "IronPythonDemo.py" ); //设置脚本文件 ScriptScope scope = pyEngine.CreateScope(); try { //设置参数 scope.SetVariable( "arg1" , Convert.ToInt32(txtNum1.Text)); scope.SetVariable( "arg2" , Convert.ToInt32(txtNum2.Text)); scope.SetVariable( "arg3" , operation.SelectedIndex + 1); } catch (Exception) { MessageBox.Show( "输入有误。" ); } source.Execute(scope); labelResult.Text = scope.GetVariable( "result" ).ToString(); } |
8、编译运行可得计算结果(此处未做输入的检查)
2、执行函数
IronPythonDemo2.py
1 2 3 4 5 6 7 8 | def main(arr): try : arr = set (arr) arr = sorted (arr) arr = arr[ 0 :] return str (arr) except Exception as err: return str (err) |
c#代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ScriptEngine pyEngine = IronPython.Hosting.Python.CreateEngine(); //创建Python解释器对象 dynamic py = pyEngine.ExecuteFile( @"IronPythonDemo2.py" ); //读取脚本文件 int [] array = new int [9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 }; string reStr = py.main(array); //调用脚本文件中对应的函数 MessageBox.Show(reStr); //或者 ScriptRuntime pyRuntime = IronPython.Hosting.Python.CreateRuntime(); //创建一下运行环境 dynamic obj = pyRuntime.UseFile( "IronPythonDemo2.py" ); //调用一个Python文件 int [] array = new int [9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 }; string reStr = obj.main(array); //调用脚本文件中对应的函数 MessageBox.Show(reStr); |
方式二:适用于python脚本中包含第三方模块的情况
C#代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | using System; using System.Collections; using System.Diagnostics; namespace Test { class Program { static void Main( string [] args) { Process p = new Process(); string path = "reset_ipc.py" ; //待处理python文件的路径,本例中放在debug文件夹下 string sArguments = path; ArrayList arrayList = new ArrayList(); arrayList.Add( "com4" ); arrayList.Add(57600); arrayList.Add( "password" ); foreach (var param in arrayList) //添加参数 { sArguments += " " + sigstr; } p.StartInfo.FileName = @"D:\Python2\python.exe" ; //python2.7的安装路径 p.StartInfo.Arguments = sArguments; //python命令的参数 p.StartInfo.UseShellExecute = false ; p.StartInfo.RedirectStandardOutput = true ; p.StartInfo.RedirectStandardInput = true ; p.StartInfo.RedirectStandardError = true ; p.StartInfo.CreateNoWindow = true ; p.Start(); //启动进程 Console.WriteLine( "执行完毕!" ); Console.ReadKey(); } } } |
python脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # -*- coding: UTF-8 -*- import serial import time def resetIPC(com, baudrate, password, timeout = 0.5 ): ser = serial.Serial(com, baudrate, timeout = timeout) flag = True try : ser.close() ser. open () ser.write( "\n" .encode( "utf-8" )) time.sleep( 1 ) ser.write( "root\n" .encode( "utf-8" )) time.sleep( 1 ) passwordStr = "%s\n" % password ser.write(passwordStr.encode( "utf-8" )) time.sleep( 1 ) ser.write( "killall -9 xxx\n" .encode( "utf-8" )) time.sleep( 1 ) ser.write( "rm /etc/xxx/xxx_user.*\n" .encode( "utf-8" )) time.sleep( 1 ) ser.write( "reboot\n" .encode( "utf-8" )) time.sleep( 1 ) except Exception: flag = False finally : ser.close() return flag resetIPC(sys.argv[ 1 ], sys.argv[ 2 ], sys.argv[ 3 ]) |
上面的python脚本实现的是重启IPC设备,测试功能成功。
调用包含第三方模块的python脚本时,尝试过使用path.append()方式,调试有各种问题,最终放弃了,没有研究。
到此这篇关于C#使用IronPython库调用Python脚本的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
这篇文章主要介绍了DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)的解决办法2015-09-09C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
这篇文章主要介绍了C#中实现在32位、64位系统下自动切换不同的SQLite dll文件,本文使用C#代码实现DLL文件的切换,需要的朋友可以参考下2014-09-09
最新评论