如何弄清楚从 C# 运行的 python 脚本是否通过或失败

本文关键字:是否 脚本 失败 python 弄清楚 运行 | 更新日期: 2023-09-27 17:55:39

我有以下代码从C#调用Python应用程序,有没有办法弄清楚从C#运行的python脚本是通过还是失败?我们是否得到任何退出/返回代码,指示从 C# 运行的 python 应用程序成功或失败

using System;
using System.IO;
using System.Diagnostics;
namespace CallPython
{
        class Program
    {
        static void Main(string[] args)
        {
            string python = @"C:''Python27'python.exe";
            string myPythonApp = @"C:''Dropbox'scripts'loadbuild'sum.py";
            int x = 2;
            int y = 5;
            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(python);
            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcessStartInfo.Arguments = myPythonApp + " " + x + " " + y;
            Process myProcess = new Process();
            myProcess.StartInfo = myProcessStartInfo;
            myProcess.Start();
            StreamReader myStreamReader = myProcess.StandardOutput;
            string myString = myStreamReader.ReadToEnd();
            myProcess.WaitForExit();
            myProcess.Close();
            Console.WriteLine("Value received from script: " + myString);
            Console.ReadLine();
        }
    }
}

如何弄清楚从 C# 运行的 python 脚本是否通过或失败

除了输出程序写入其(标准)输出通道外,程序总是以退出状态(或退出代码)终止。如果程序运行正确,则应0退出代码退出,如果出现错误,则应使用退出代码0退出。

现在,当出现算术错误时,python程序通常会以0以外的退出状态退出,例如程序:

a = 4/0

不仅会产生错误消息:

Traceback (most recent call last):
  File "test.ply", line 1, in <module>
    a = 4/0
ZeroDivisionError: integer division or modulo by zero

但也返回退出状态1.现在显然,python程序员可以使用try - catch处理,以便错误不会导致除零以外的退出状态,但这至少部分会破坏退出状态的使用。

如果python程序的程序员在错误正确时实现了退出代码,或者错误是算术错误,则python程序将以非零的退出代码退出。

您可以使用 Process.ExitCode 捕获退出代码。

在文档手册中,我们可以阅读:

开发人员通常通过ExitCode值零来指示成功退出,并通过调用方法可用于识别异常进程终止原因的非零值来指定错误。没有必要遵循这些准则,但它们是惯例。

例如:

//...
myProcess.WaitForExit();
int ec = myProcess.ExitCode;
if(ec != 0) {
    //oops the Python program made an error
} else {
    //assume everything went fine
}