Python与C#: IronPython是绝对必要的吗?

4 投票
3 回答
1298 浏览
提问于 2025-04-16 04:45

我主要是做C#编程的,但现在有个项目让我面临两个选择:

  1. 调用一个Python脚本(保存为.py文件),然后处理返回的结果,或者……
  2. 把整个Python脚本(总共涉及6个.py文件)重写成C#。

显然,如果我可以简单地选择第一种方式,第二种方式就会浪费很多时间。而且,第一种方式还是个学习的机会,而第二种方式就显得很无聊。

所以,我的问题是:有没有办法创建一个C#的进程对象,来触发.py文件的脚本,并且获取脚本的返回值,而不使用IronPython?我并不反对使用IronPython,只是我需要尽快找到解决方案,所以如果能先跳过IronPython的学习曲线,等到我有更不紧急的工作再去学,那就最好不过了。

谢谢。

3 个回答

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;
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构建的网络服务,把数据以JSON、XML或其他标准格式传给C#系统。有时候,重新审视一下你的系统架构会更好。

6

使用 Process.Start 来运行 Python 脚本。在 ProcessStartInfo 对象中,你需要指定:

  • FileName = Python 脚本的路径和文件名。

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

  • RedirectStandardOutput = true(如果需要的话,也可以设置 RedirectStandardError

  • UseShellExecute = false

然后你会得到一个 Process 对象,你可以在这个对象上做一些事情,特别是:

  • 使用 Process.StandardOutput 来读取 Python 脚本的输出。例如,你可以调用 ReadToEnd() 来获取一个包含所有输出的字符串,或者在循环中调用 ReadLine()

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

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

撰写回答