【问题标题】:Get Python to read a return code from C# in a reliable fashion让 Python 以可靠的方式从 C# 读取返回码
【发布时间】:2020-12-31 23:26:32
【问题描述】:

我用 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 返回一个整数。我遇到了完全相同的问题。

【问题讨论】:

    标签: python c# mono return-code


    【解决方案1】:

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

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

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

    >>> 193<<8
    49408
    

    您可能希望将该部分更改为使用 subprocess,例如就像this question的答案一样

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

    >>> 1729 & 255
    193
    

    【讨论】:

    • 谢谢你。如果你能给我更多关于&gt;&gt;&gt; 193&lt;&lt;8 // 49408 的解释,我会在 SO 允许我这样做时立即奖励你。 (虽然我仍然不明白 &gt;&gt;&gt; 1729 &amp; 255 // 193,但我确实得到了 193 = 1729 mod 256,我认为这相当于同一件事。)
    • 当然! &lt;&lt; 是二进制左移运算符,它获取数字并将其二进制表示向左移动给定位数(在这种情况下为 8)。在您的示例中,os.system 调用执行的命令的返回码(退出状态)是 193。该数字的二进制表示形式是 0b11000001,在 16 位形式中类似于 0b0000000011000001。现在,如果您将该数字向左一一移动 8 次,您将得到 0b1100000100000000,即 49408。因此,正如文档所述,生成的 16 位数字由两个 8-位数字粘在一起
    • 谢谢! SO 说我必须再等 18 小时才能获得赏金,所以期待它吧。
    • 至于&amp;,它是按位的and 运算符,因此它应用于两个数字意味着采用两个数字的二进制表示,并将and 运算符应用于每对具有相同的重要性顺序。在这种情况下,1729 的 16 位二进制表示是 0b0000011011000001,255 的 16 位二进制表示是 0b0000000011111111(即最低 8 位全为 1,最高 8 位全为零),因此通过应用&amp; 到任何以 255 作为操作数之一的数字,我们将从该数字中选择最低 8 位。
    • > SO 说我必须再等 18 小时才能获得赏金,所以期待它吧。明白了,谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多