C#调用Python脚本的两种实现方式
本文介绍了在C#控制台程序中执行Python脚本的两种主要方法。第一种利用IronPython引擎直接调用,适用于无第三方依赖的简单脚本;第二种通过System.Diagnostics.Process启动Python解释器进程,支持包含第三方模块的复杂场景。文章提供了完整的C#与Python代码示例及注意事项。
C#调用Python脚本概述
由于项目需求,需要在C#控制台程序中执行Python脚本。经过查阅相关资料并实践,成功实现了调用功能,特此记录以便日后查阅。
前置准备:安装IronPython
本文仅演示两种调用方式:第一种适用于Python脚本不依赖第三方模块的场景;第二种则针对包含第三方模块的Python脚本。无论采用哪种方式,前提都是必须安装IronPython。可以通过Visual Studio 2017的工具菜单进入NuGet包管理器,搜索并安装IronPython包;或者从官网下载安装包,安装后手动添加引用即可。
方式一:直接调用(无第三方模块)
方式一:适用于Python脚本中不包含第三方模块的情况。
C#代码实现如下:
C#端代码
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
namespace CSharpCallPython
{
class Program
{
static void Main(string[] args)
{
ScriptEngine pyEngine = Python.CreateEngine();//创建Python解释器对象
dynamic py = pyEngine.ExecuteFile(@"test.py");//读取脚本文件
int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
string reStr = py.main(array);//调用脚本文件中对应的函数
Console.WriteLine(reStr);
Console.ReadKey();
}
}
}
对应的Python脚本内容如下:
Python端代码
def main(arr):
try:
arr = set(arr)
arr = sorted(arr)
arr = arr[0:]
return str(arr)
except Exception as err:
return str(err)
运行结果如图所示:

方式二:进程调用(含第三方模块)
方式二:适用于Python脚本中包含第三方模块的情况。
C#代码实现如下:
C#端代码
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脚本内容如下:
Python端代码
# -*- 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()方法修改路径,但调试过程中遇到诸多问题,最终放弃该方法,未做深入研究。
以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













