获取Python以可靠的方式从C#读取返回代码

问题描述

我已经用 Python 编写了一个大型程序,需要与较小的 C#脚本对话。 (我意识到让Python和C#互相交谈不是理想的状况,但是我被迫通过需要C#脚本的硬件来做到这一点。)我要特别实现的目标是-这个问题的动机-是我想知道C#脚本中何时发生特定捕获的异常

我一直在尝试通过使Python程序查看C#脚本的返回代码来实现上述目标。我遇到的问题是,如果我告诉C#提供返回码 x ,我的操作系统将收到一个返回码 y ,而Python将收到返回代码 z 。虽然给定的 x 似乎总是对应于特定的 y 和特定的 z ,但我很难理解这三个之间的关系;它们应该相同。

以下是我的设置的详细信息:

  • 我的Python版本是 Python 3
  • 我的操作系统是 Ubuntu 20.04
  • 我正在使用 Mono 来编译和运行我的C#脚本。

这是我正在谈论的那种事情的最小工作示例:

这是一个很小的C#脚本:

namespace ConsoleApplication1
{
    class Script
    {
        const int ramanujansNumber = 1729;

        bool Run()
        {
            return false;
        }

        static int Main(string[] args)
        {
            Script program = new Script();
            if(program.Run()) return 0;
            else return ramanujansNumber;
        }
    }
}

如果我使用mcs Script.cs进行编译,请使用mono Script.exe运行它,然后运行echo $?,它会显示 193 。另一方面,如果我运行以下Python脚本:

import os

result = os.system("mono Script.exe")
print(result)

它打印 49408 。这三个数字之间的关系是:1729、193、49408?如果我知道C#脚本将返回什么,是否可以预测Python将收到的返回代码

注意:我尝试在C#脚本中使用Environment.Exit(code),而不是让Main返回整数。我遇到了完全相同的问题。

解决方法

使用os.system the documentation明确声明结果与os.wait的格式相同,即:

一个16位数字,其低字节是杀死该进程的信号号,而其高字节是退出状态(如果信号号为零);如果生成了核心文件,则设置低字节的高位。

因此您的情况如下:

>>> 193<<8
49408

您可能希望将该部分更改为使用subprocess,例如如对this question

的回答

UPD:至于mono返回码,看起来好像只使用了它的低字节(即,预期在0到255之间)。至少:

>>> 1729 & 255
193