问题描述
我已经用 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