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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。