Python与C#: IronPython是绝对必要的吗?
我主要是做C#编程的,但现在有个项目让我面临两个选择:
- 调用一个Python脚本(保存为.py文件),然后处理返回的结果,或者……
- 把整个Python脚本(总共涉及6个.py文件)重写成C#。
显然,如果我可以简单地选择第一种方式,第二种方式就会浪费很多时间。而且,第一种方式还是个学习的机会,而第二种方式就显得很无聊。
所以,我的问题是:有没有办法创建一个C#的进程对象,来触发.py文件的脚本,并且获取脚本的返回值,而不使用IronPython?我并不反对使用IronPython,只是我需要尽快找到解决方案,所以如果能先跳过IronPython的学习曲线,等到我有更不紧急的工作再去学,那就最好不过了。
谢谢。
3 个回答
使用System.Diagnostics.Process来运行Python脚本,然后在脚本执行完毕后,使用Process.ExitCode来获取脚本的返回值:
// Start the script
var process = System.Diagnostics.Process.Start("python MyScript.py");
// Wait for the script to run
process.WaitForExit();
int returnVal = process.ExitCode;
你可以这样做:
Process py = new Process();
py.StartInfo.FileName = "python.exe";
py.StartInfo.Arguments = "c:\\python\\script.py";
py.StartInfo.UseShellExecute = false;
py.StartInfo.CreateNoWindow = true;
py.StartInfo.RedirectStandardOutput = true;
py.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
py.Start();
py.BeginOutputReadLine();
py.WaitForExit();
py.Close();
不过,我得说,你可以有多个系统,它们用不同的语言编写,但它们之间可以互相理解。也就是说,有一些标准可以把这些系统连接起来。比如,Python系统可以通过一个用Python构建的网络服务,把数据以JSON、XML或其他标准格式传给C#系统。有时候,重新审视一下你的系统架构会更好。
使用 Process.Start
来运行 Python 脚本。在 ProcessStartInfo
对象中,你需要指定:
FileName
= Python 脚本的路径和文件名。Arguments
= 你想传递给脚本的任何参数。RedirectStandardOutput
= true(如果需要的话,也可以设置RedirectStandardError
)UseShellExecute
= false
然后你会得到一个 Process
对象,你可以在这个对象上做一些事情,特别是:
使用
Process.StandardOutput
来读取 Python 脚本的输出。例如,你可以调用ReadToEnd()
来获取一个包含所有输出的字符串,或者在循环中调用ReadLine()
。使用
Process.ExitCode
来读取脚本的返回代码。使用
Process.WaitForExit
来等待脚本完成。