2011-06-14 2 views
0

두 개 (관련?) 질문은 여기에 있습니다.Popen에 의해 호출되고 stdin에 쓰여질 때 Python 이상한 동작

외부 프로세스를 시작하기 위해 프로그램을 작성하려고 시도한 다음에 simultaniouly stdout에서 읽고 stdin에 씁니다. 모든 것이 작동하는 것처럼 보였지만 프로세스가 표준 파이프로 전송 된 데이터에 응답하지 않았습니다. 왜 이렇게 될지 아십니까? (1)

이 두 번째 질문은 지금 해결되었습니다.

나는 처음과 같은했다,이 테스트 스크립트를 작성 :

# recv.py 
while True: 
    print(input()) 

두 번째 (가) 그것을 어떤 임의의 입력을주고는 popen을 사용하여 다른 전화하도록 설계되었습니다 :

# send.py 
recv = subprocess.Popen(["python", "recv.py"], stdin=subprocess.PIPE) 
recv.stdin.write(b"Hello\n") 
recv.stdin.write(b"World.\n") 

이를

[email protected]:testing$ python send.py 
[email protected]:testing$ Traceback (most recent call last): 
    File "recv.py", line 30, in <module> 
    main() 
    File "recv.py", line 26, in main 
    print(input()) 
    File "<string>", line 1, in <module> 
NameError: name 'Hello' is not defined 

마치 whatev처럼 보입니다. 그 이유는 input()의 결과가 문자열 대신에 줄의 일부처럼 다루어지고 있기 때문입니다. 실제로 recv.py에 변수 Hello을 설정하면 Hello의 내용이 출력됩니다. 이 문제가 발생하는 이유는 무엇입니까? (2)

저는 Mac OSX에서 python 3.1.2를 실행하고 있습니다. 당신이보고있는 무엇

+0

아마 (1)에 대한 답을 격려하기 위해 코드에 대한보다 명쾌한 설명을 제공해야합니다. – chisaipete

답변

3

sys.stdin (같은 raw_input())에서 선을 소요하고 파이썬 코드로 평가 파이썬 2.x에서의 input() 기능의 예상 된 동작입니다. 일반적으로 Python 2.x에서 input()을 사용하는 것은 좋지 않습니다 :) Python 3.x에서 input()이 제거되었고 raw_input()의 이름이 input()으로 바뀌 었습니다. 그 이유는 무엇 때문인지 혼란 스러울 수 있습니다.

Python 3.x를 설치하지 않아도 설치가 가능합니다. python 명령은 아마도 시스템에 설치된 Python 2.x 명령 일 것입니다. 대신 python3 또는 python3.1으로 실행 해보십시오.

+0

당신은''python'이 제'.profile'의 별명이고,'Popen'이 제 별명을 따르지 않는다고 가정 할 수 있습니다. – Violet

2

이 실제로 인 Python 3을 실행하고 있는지 확인하십시오. 파이썬 2.x input()처럼 의심스럽게 보입니다. 여기서는 입력을 파이썬 표현식으로 해석합니다 (raw_input()은 파이썬 3의 input()이됩니다).

+1

님, 'python'은 'python3.1'의 별칭이지만 Popen은 해당 별칭을 따르지 않습니다. – Violet