2013-05-12 1 views
0

두 가지 프로그램이 있습니다. C++로 작성된 첫 번째 (subprocess.cpp) :python stdout.flush()는 ' n'과 같은 마지막 흰색 글자를 플러시하지 않습니다.

#include <stdio.h> 

int main() { 

    char * line = new char[1000]; 

    // first scan 
    scanf("%s\n", line); 
    printf("%s\n", line); 
    fflush(stdout); 

    // second scan 
    scanf("%s\n", line); 
    printf("%s\n", line); 
    fflush(stdout); 

    return 0; 
} 

이 프로그램은 단순히 표준 입력에서 두 개의 문자열을 얻고 결국 세척, 표준 출력에에서 인쇄합니다. 다음은 파이썬 2.7로 작성된 두 번째 프로그램 (test.py)이다 :이 스크립트는 subproccess을 시작 보내고 두 문자열을 검색해야

from subprocess import Popen 
from subprocess import PIPE 
from subprocess import Popen 

# create process 
my_process = Popen("./subprocess", stdin = PIPE, stdout = PIPE) 

# send initial data 
my_process.stdin.write('abc\n') 
my_process.stdin.flush() 
my_process.stdin.write('xyz\n') 
my_process.stdin.flush() 

# read data from subprocess 
print "Subprocess line 1 :: " + str(my_process.stdout.readline()) 
print "Subprocess line 2 :: " + str(my_process.stdout.readline()) 

은. happpening 무엇 봐 :

[email protected] ~/Desktop/inzynierka $ g++ subprocess.cpp -o subprocess 
[email protected] ~/Desktop/inzynierka $ python test.py 
Subprocess line 1 :: abc 

test.py 프로그램 subprocess에서 두 번째 줄을 기다리고 있습니다. 프로그램 subprocess은 '\ n'문자를 기다리고 있기 때문에 두 번째 문자열을 보낼 수 없습니다.

subprocess.cpp에서 scanf을 두 번째로 변경하면 scanf("%s\n", line); (아니 \n) 모두 정상적으로 작동합니다.

# send initial data 
my_process.stdin.write('abc\n') 
my_process.stdin.flush() 
my_process.stdin.write('xyz\n') 
my_process.stdin.flush() 
my_process.stdin.write('ADDITIONAL\n') 
my_process.stdin.flush() 

파이썬 (변경된는 scanf와 예 참조) 세척 후에는 마지막 \ n을 문자를 보내지 않는 것 같습니다 : 나는 test.py에서 하나 개의 추가 라인을 보낼 때 같은 문제가 발생합니다. test.py에 쓰기 및 플러시를 한 개 더 추가하면 누락 된 \ n 문자가 플러시 후에 버퍼에 남아 있음이 증명됩니다.

어떻게해야합니까? 파이썬에서 모든 문자를 지우는 방법?

답변

2

오류는 \ n i 형식 문자열을 사용하는 scanf 동작입니다. 파이프를 사용하거나 터미널을 사용할 때 첫 번째 비어 있지 않은 라인 다음에 scanf ("% s \ n")가 첫 번째 공백이 아닌 문자 뒤에 \ n 뒤에 나오는 경우 (다음 공백 문자가 다음에 \ n 플러시되기 때문에)).

요점은 아마도 scanf ("% s \ n")를 사용하지 않았다는 것입니다. 내 생각 엔 당신이 정말로 원하는 것은 다음과 같습니다.

scanf("%s%*[^\n]", line); 

단어를 읽고 동일한 줄의 모든 문자를 버립니다.

+0

동의하신 문제는 파이썬이 아닌 scanf 형식 문자열에 '\ n'을 사용하는 것입니다. 사실, 단지'scanf ("% s", line)'은 효과가 있고'(int)에 따라'('line()'이된다. –

+0

감사합니다. 문제가 Python 자체에 있지 않다는 것을 전혀 알지 못했습니다. –

1

문제는 scanf("%s\n", line)이고, 두 번째 scanf()은 공백이 아닌 문자를 찾기 전에 다른 행을 읽을 필요가 있습니다.

비슷한 케이스 here에 대한 좋은 설명이 있습니다.

또한 strace으로 확인한 후 파이썬은 마지막으로 '\n' 문자를 전송합니다.

pid 6611: test.py 
pid 6613: subprocess 

> strace -f python test.py 
[pid 6611] write(4, "abc\n", 4 <unfinished ...> 
... 
[pid 6611] write(4, "abc\n", 4 <unfinished ...> 
... 
[pid 6613] read(0, "abc\nxyz\n", 4096) = 8 
... 
[pid 6613] write(1, "abc\n", 4)  = 4 
[pid 6611] <... read resumed> "a", 1) = 1 
[pid 6613] read(0, <unfinished ...> 
[pid 6611] read(5, "b", 1)    = 1 
[pid 6611] read(5, "c", 1)    = 1 
[pid 6611] read(5, "\n", 1)   = 1 
... 
[pid 6611] write(1, "Subprocess line 1 :: abc\n", 25Subprocess line 1 :: abc) = 25 
[pid 6611] write(1, "\n", 1)   = 1 
[pid 6611] read(5, 
관련 문제