2017-01-15 3 views
2

다음 Python 코드가 있습니다.이 Python 코드는 C++ 프로그램에 초기 입력을 제공 한 다음 출력을 가져 와서 프로그램이 끝날 때까지 다시 제공합니다 완료 실행 :Python : C++ 명령 행 프로그램과의 통신이 작동하지 않습니다. <cstdio>

comm.py

p = subprocess.Popen('test__1.exe', bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False) 
p.stdin.flush() 
p.stdout.flush() 
x = b'1\n' 
while True: 
    p.stdin.write(x) 
    p.stdin.flush() 
    p.stdout.flush() 
    x = p.stdout.readline() 
    print(x) 
    if p.poll() != None: 
     break 

저는 현재 두 가지 간단한 C++ 프로그램을 테스트입니다 :

test__1.cpp :

#include <iostream> 
using namespace std; 
int main() 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     int n; 
     cin >> n; 
     cout << n+1 << endl; 
    } 
    return 0; 
} 

test__2.cpp

#include <cstdio> 
int main() 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     int n; 
     scanf("%d", &n); 
     printf("%d\n", n+1); 
    } 
    return 0; 
} 

comm.pytest__1.exe 모든 것이 잘 작동 열리지 만이 test__2.exe을 열 때이 의 readline에 첫 번째 호출에 응답하지 않는다(). I가 실행 전에 test__2.exe 전체 입력을 공급하면이 문제가 발생하지 주 (즉 초기 설정 X = '1 \ N2 \ N3 \ n')이 문제의 원인이 될 수있는 것을

?

(또한, comm.py 그렇게 만 iostream이 허용 솔루션이 아닐 것이다 사용하여 유효한 C++ 프로그램을 처리 할 수 ​​있어야합니다.)

편집 : 나는 또한 Windows에서 작업 할 수있는 솔루션이 필요합니다.

답변

1

그것은 std::endl은 다음과 같이 test__2.cpp을 개정하여 볼 수 있듯이 ostreamprintfstdout, 를 플러시하지 않습니다 플러시는 사실로 인해 발생 :

#include <cstdio> 
int main() 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     int n; 
     scanf("%d", &n); 
     printf("%d\n", n+1); 
     fflush(stdout); //<-- add this 
    } 
    return 0; 
} 

당신은 당신이 제대로 작동하려면 모듈 싶은 말 어떤 C++ 프로그램이라해도 쓸 때마다 표준 출력 (또는 표준 오류) 을 플러시 할 수 없습니다. 이 프로그램의 표준 스트림 버퍼링 원인이 될 프로그램 자체에 너무 외부 수행해야 함을 의미

. 을 comm.py에 입력해야합니다.

Linux (또는 GNU Core Utils를 제공하는 다른 호스트)에서 은 stdbuf을 통해 프로그램을 실행할 수 있습니다.

import subprocess 

cmd = ['/usr/bin/stdbuf', '-i0','-o0', '-e0', './test__2'] 
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False) 
p.stdin.flush() 
p.stdout.flush() 
x = b'1\n' 
while True: 
    p.stdin.write(x) 
    x = p.stdout.readline() 
    print(x) 
    if p.poll() != None: 
     break 

모든 표준 스트림을 버퍼링하지 않습니다. Windows의 경우 동일한 작업을 수행하려면 이 필요합니다. 당분간 나는 모른다.

+0

이것은 유효한 해결책이지만, 유효한 C++ 프로그램을 사용하려면 comm.py가 필요하므로 불행히도 내 문제는 해결되지 않습니다. ostream을 플러시 할 때 다음 줄이 표시되지 않는 이유는 무엇입니까? p.stdout.flush() ? –

+0

@ black-goat 예, 나는 그것을 숙고하고 있었지만 아직도 있습니다. 업데이트를 참조하십시오. –

+0

입력 해 주셔서 감사합니다. 슬프게도 나는 Windows에서도 작동해야한다고 언급하는 것을 잊어 버렸지 만, 나는 당신의 제안에 대한 아날로그를 찾으려고 노력할 것이다. –