2017-09-20 15 views
2

私はPythonのサブプロセスオプションをテストしている。私はC言語で簡単なコードを書いたので、Pythonのサブプロセスで実行したい。これは、それがどのように見えるかです:Pythonサブプロセスが間違った値を返す(64ビットの代わりに8ビットの値を与える)

Cコードはexample.c(最初、私はコードを実行して、サブプロセスで、私は、実行可能ファイルを使用しています):

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    int number= 2110; 

    while (1==1) 
    { 
     printf("%d",number); 
     printf(" return number: ") 
     return number; 

    } 
    return 0; 
} 

Pythonのコード:

def subTest(): 
    while True: 
     numberS = subprocess.call('./example') 
     print (numberS) 

出力私が手

2110 return number: 2110 

出力:

私は、実行Pythonコードの後に​​持っているべきです
2110 return number: 62 

私はそれをいくつかの '数字'と適切な値でテストしますが、255まで、次に256 - > 0などです。なぜですか?なぜそれが8ビット値を与え、適切な値を返すためにそれを行うのですか?

答えて

3

これはPythonでは問題ありませんが、実際にはLinuxの機能です。 Looking at this answer:だから

At the present time, most Unix-based systems only support 8-bit return values. Windows supports (at least) a 32-bit return value.

、あなたはint main()を持っているにもかかわらず、戻り値はリンク質問からまた0から255に拘束され、その後、あなたがUnixであると仮定すると:

int main(void){ 
return 256; 
} 
echo $? ; # out 0 

あなた'LL値を返す別の方法を見つける必要があります - おそらくそれを印刷しますか? This answer shows how to do it

run = subprocess.Popen('./example', stdout = subprocess.PIPE, 
         stderr = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 
numberS = int(data) 
+0

私はRaspbianにあります。これは唯一の8ビット値を返します。たとえば、もし私が 'long long int main()'を持っていれば、同じ問題があります。 'ValueError:基数10のint()の無効なリテラル:b '' – BengBeng

+0

あなたのコードには、あなたが指定した通りに' printf( "%d"、number); 'が必要ですあなたの質問で。まるで何も印刷していないかのように見えます。 –

関連する問題