Python脚本中的C system()返回值 - 令人困惑!

0 投票
2 回答
546 浏览
提问于 2025-04-16 06:39

我需要从C语言调用一个Python脚本,并且能够获取它返回的值。返回的值其实不重要,可以是枚举类型,但我在测试中得到的值让我感到困惑,我想弄清楚我看到的是什么。

下面是C语言的代码:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
  int out = 0;

  out = system("python /1.py");
  printf("script 1 returned %d\n", out);

  return 0;
}

这是 /1.py 的内容:

import sys
sys.exit(1)

这些程序的输出结果是:

script 1 returned 256

还有一些其他的值:

2       -> 512
800     -> 8192
8073784 -> 14336

假设它是以小端格式而不是大端格式读取数据,或者其他什么原因?我该如何写一个C语言函数(或者用什么方法让Python来处理)来正确返回和解释这些数字呢?

2 个回答

1

system()这个函数的返回值格式是由waitpid()决定的。它的结束状态和sh工具定义的方式不太一样。我记不太清楚具体是怎样的,但大概是这样的:

int exit_value, signal_num, dumped_core;

...

exit_value  = out >> 8;
signal_num  = out & 127;
dumped_core = out & 128;
2

根据Linux的文档关于system()的说明:

... 返回的状态格式是按照wait(2)中规定的。因此,命令的退出代码可以通过WEXITSTATUS(status)来获取 ...

从关于wait的链接中,我们了解到:

WEXITSTATUS(status):返回子进程的退出状态。 ... 这个宏只有在WIFEXITED返回真时才能使用。

这就是说,你不能直接使用system()的返回值,而是需要用一些宏来处理它们。而且,因为这符合C语言的标准,不仅仅是Linux的实现,所以在你使用的任何操作环境中,都需要遵循同样的步骤。

撰写回答