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

2024-04-18 03:13:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用Python编写了一个大型ish程序,我需要与一个较小的C#脚本进行对话。(我意识到让Python和C#互相对话并不是一种理想的状态,但我不得不这样做,因为这需要一个C#脚本。)我特别想要实现的是,这个问题背后的动机是,我想知道在C#脚本中何时发生特定的捕获异常

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

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

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

下面是我所说的这类事情的一个最简单的工作示例:

这是一个小小的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。这三个数字之间的关系是什么:172919349408?如果我知道C#脚本将返回什么,我可以预测Python将接收到的返回代码吗

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


Tags: run代码程序脚本return关系mainscript
1条回答
网友
1楼 · 发布于 2024-04-18 03:13:49

使用os.systemthe 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返回代码,看起来只使用了它的较低字节(即,它应该在0到255之间)。至少:

>>> 1729 & 255
193

相关问题 更多 >