获取 Python 以可靠的方式从 C# 中读取 return 代码

Get Python to read a return code from C# in a reliable fashion

我在 Python 中编写了一个大型程序,我需要与较小的 C# 交谈脚本。 (我意识到让 Python 和 C# 相互交谈并不是理想的状态,但我不得不通过一个硬件来做到这一点,这需要一个 C# 脚本。)我想要什么特别是 achieve - 这个问题背后的动机 - 我想知道在 C# 脚本中什么时候发生特定的捕获异常

我一直在尝试通过让我的 Python 程序查看 C# 脚本的 return 代码 来实现上述目标。我遇到的问题是,如果我告诉 C# 给出一个 return 代码 x,我的 OS 将收到一个 return 代码 y 和 Python 将收到 return 代码 z。虽然给定的 x 似乎总是对应于特定的 y 和特定的 z,但我难以理解三者之间的关系;他们应该是一样的。

以下是我的设置细节:

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

这是一个小型 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# 脚本将 return 的内容,我可以预测 Python 将收到的 return 代码吗?

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

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

a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number is zero); the high bit of the low byte is set if a core file was produced.

所以在你的情况下它看起来像:

>>> 193<<8
49408

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

的回答

UPD:至于 mono return 代码,看起来只使用了它的低字节(即它应该在 0 到 255 之间)。至少:

>>> 1729 & 255
193