Python和C#: IronPython是必需的吗?

4

我主要是一名C#程序员,但现在有一个项目让我面临两个选择:

  1. 调用一个Python脚本(保存为.py文件)并处理返回值,或者...
  2. 重新编写整个Python脚本(总共涉及6个.py文件)成C#。

显然,如果我可以简单地实现Option 1,那么Option 2将是极大的时间浪费。此外,Option 1是一个学习机会,而Option 2则是完全的技术逃避。

所以,我的问题是:是否有一种方法可以构建一个C# Process对象来触发.py文件的脚本,并捕获脚本的返回值而不使用IronPython?我并不反对可能使用IronPython,只是需要尽快找到解决方案,因此如果我能够避开I.P.学习曲线直到我有更少紧急工作要做,那将是最理想的。

谢谢。


5
选项3:用Python完全重写C#应用程序 :) - Mark Thomas
3个回答

6
使用Process.Start来运行Python脚本。在ProcessStartInfo对象中,您需要指定:
  • FileName = Python脚本的路径和文件名。

  • Arguments = 您想要传递给脚本的任何参数。

  • RedirectStandardOutput = true (如有需要,还包括RedirectStandardError)

  • UseShellExecute = false

然后您将获得一个Process对象,在该对象上您可以执行一些操作,特别是:
  • 使用Process.StandardOutput读取Python脚本的输出。您可以例如调用ReadToEnd()来获取包含整个输出内容的单个字符串,也可以在循环中调用ReadLine()

  • 使用Process.ExitCode读取脚本的返回代码。

  • 使用Process.WaitForExit等待脚本完成。


就性能而言,使用IronPython和使用Process.Start调用脚本之间有区别吗? - gl3yn

2
您可以这样做:
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 中构建的 Web 服务使用 JSON、XML 或其他标准来向 C# 系统提供数据。有时候重新审视你的架构是更好的选择。

2
使用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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接