2010-11-06 53 views
0

我需要从C调用一个python脚本,并能够从中捕获返回值。它的值并不特别重要,它们可能也是一个枚举,但是我从测试用例中获得的价值让我困惑不已,而且我想要深入了解我所看到的。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 

假设它是...阅读而不是大的endian,或什么?我怎么能写一个c函数(或伎俩python中)正确返回和解释数字?

回答

2

在Linux上documentation系统():

...返回状态是在等待指定的格式(2)。因此,命令的退出代码将是WEXITSTATUS(状态)...

从下面就wait的链接,我们得到如下:

WEXITSTATUS(状态):返回退出状态的孩子。 ...只有在WIFEXITED返回true的情况下才应该使用此宏。

这相当于你不能直接使用system()的返回值,但必须使用宏来操纵它们。而且,由于这符合C标准,而不仅仅是Linux实现,所以您将需要对您正在使用的任何操作环境使用相同的过程。

+0

C99§7.20.4.6.3:“如果参数是一个空指针,那么只有当命令处理器可用时,'system'函数才返回非零值;如果参数不是空指针,'system'函数返回,它返回一个实现定义的值。“ – 2010-11-06 01:23:26

+0

@Adam,@Hasturkun,感谢您的纠正。 – 2010-11-06 13:55:51

+0

我不知道为什么system()手册页不只是说“你可以通过调用'WEXISTSTATUS(system(”command“));'”来访问返回值,但我确定有一个很好的理由。感谢澄清:) – tehwalrus 2010-11-07 13:02:26

1

system()调用返回值采用waitpid()指定的格式。终止状态不是为sh实用程序定义的。我不记得,但它的工作原理是这样的:

int exit_value, signal_num, dumped_core; 

... 

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