2017-09-20 2 views
2

파이썬에서 하위 프로세스 옵션을 테스트하고 있습니다. 나는 C로 간단한 코드를 작성했으며 파이썬에서 서브 프로세스로 실행하고 싶다. 이는 모습입니다 :파이썬 하위 프로세스가 잘못된 값을 제공함 (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; 
} 

파이썬 코드 :

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

출력 내가 할

2110 return number: 2110 

출력 : 나는 실행 파이썬 코드 뒤에해야하는

012,351을
2110 return number: 62 

나는 '255'와 255까지 얻을 수있는 '숫자'와 적절한 값을 테스트한다. 왜 그런가? 왜 8 비트 값을주고 적절한 값을 반환하는 방법?

답변

3

이것은 파이썬에는 문제가되지 않지만 실제로는 Linux의 기능입니다. Looking at this answer :

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

당신은거야 : 그래서

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까지 구속되어, 유닉스에있는 값을 반환하는 또 다른 방법을 찾아야합니다. 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

그래, 이건 단지 8 비트 값을 반환하는 것에 대한 미친 짓이야. 예를 들어'long long int main()'을 사용하면 어떤 문제가 발생합니다. 하지만 당신의 코드를 사용하면 다음과 같은 오류가 발생합니다 :'ValueError : 밑이 10 인 int()에 대한 리터럴이 올바르지 않습니다. '' – BengBeng

+0

코드에 'printf ("% d", number);가 있어야합니다. 귀하의 질문에. 마치 아무것도 인쇄하지 않는 것처럼 보입니다. –

관련 문제