获取 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,但我难以理解三者之间的关系;他们应该是一样的。
以下是我的设置细节:
- 我的 Python 版本是 Python 3.
- 我的OS是Ubuntu20.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# 脚本将 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
我在 Python 中编写了一个大型程序,我需要与较小的 C# 交谈脚本。 (我意识到让 Python 和 C# 相互交谈并不是理想的状态,但我不得不通过一个硬件来做到这一点,这需要一个 C# 脚本。)我想要什么特别是 achieve - 这个问题背后的动机 - 我想知道在 C# 脚本中什么时候发生特定的捕获异常。
我一直在尝试通过让我的 Python 程序查看 C# 脚本的 return 代码 来实现上述目标。我遇到的问题是,如果我告诉 C# 给出一个 return 代码 x,我的 OS 将收到一个 return 代码 y 和 Python 将收到 return 代码 z。虽然给定的 x 似乎总是对应于特定的 y 和特定的 z,但我难以理解三者之间的关系;他们应该是一样的。
以下是我的设置细节:
- 我的 Python 版本是 Python 3.
- 我的OS是Ubuntu20.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# 脚本将 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