C#调用python脚本的方法步骤(2种)
因项目需要,需要使用C#控制台程序执行python脚本,查询各种资料后可以成功调用了,记录一下,以备后面遗忘。
只尝试了两种调用方式,第一种只适用于python脚本中不包含第三方模块的情况,第二种针对的是python脚本中包含第三方模块的情况。不管哪种方式,首先都需要安装IronPython。我是通过vs2017的工具->NuGet包管理器->管理解决方案的NuGet包,搜索IronPython包安装,也可以在官网下载安装包自行安装后添加引用即可。
方式一:适用于python脚本中不包含第三方模块的情况
C#代码
usingIronPython.Hosting; usingMicrosoft.Scripting.Hosting; usingSystem; namespaceCSharpCallPython { classProgram { staticvoidMain(string[]args) { ScriptEnginepyEngine=Python.CreateEngine();//创建Python解释器对象 dynamicpy=pyEngine.ExecuteFile(@"test.py");//读取脚本文件 int[]array=newint[9]{9,3,5,7,2,1,3,6,8}; stringreStr=py.main(array);//调用脚本文件中对应的函数 Console.WriteLine(reStr); Console.ReadKey(); } } }
python脚本
defmain(arr): try: arr=set(arr) arr=sorted(arr) arr=arr[0:] returnstr(arr) exceptExceptionaserr: returnstr(err)
结果
方式二:适用于python脚本中包含第三方模块的情况
C#代码
usingSystem; usingSystem.Collections; usingSystem.Diagnostics; namespaceTest { classProgram { staticvoidMain(string[]args) { Processp=newProcess(); stringpath="reset_ipc.py";//待处理python文件的路径,本例中放在debug文件夹下 stringsArguments=path; ArrayListarrayList=newArrayList(); arrayList.Add("com4"); arrayList.Add(57600); arrayList.Add("password"); foreach(varparaminarrayList)//添加参数 { 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脚本
#-*-coding:UTF-8-*- importserial importtime defresetIPC(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-9xxx\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) exceptException: flag=False finally: ser.close() returnflag resetIPC(sys.argv[1],sys.argv[2],sys.argv[3])
上面的python脚本实现的是重启IPC设备,测试功能成功。
调用包含第三方模块的python脚本时,尝试过使用path.append()方式,调试有各种问题,最终放弃了,没有研究。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。