2010-11-06 51 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;