2011-12-01 4 views
5

파이썬이 아닌 서브 프로세스로 쉘을 옮겨서 파이썬에서 stdin과 stdout을 상속하려고합니다. - 내가 파이썬 - 서브 프로세스와 파이썬 쉘

subprocess.Popen

를 사용하고 난 콘솔에서 호출하고 경우에 아마 일하는 것이,하지만 난

(나는 방법에 의해 IDLE을 사용하고 있습니다) 파이썬 쉘을 사용하고 때 확실히 작동하지 않습니다

파이썬이 비 파이썬 서브 프로세스가 파이썬 쉘에 stdout을 인쇄하도록 허용 할 수있는 방법이 있습니까?

답변

6

이 아니라 IDLE에서, 스크립트에서 대화 형 인터프리터에서 모두 작동합니다

subprocess.Popen(whatever, stdin=sys.stdout, stdout=sys.stdin) 

당신은 subprocess.Popen에 인수로 sys.stdinsys.stdout에 IDLE가 지정 개체를 사용할 수 없습니다. 이 객체 (IDLE 쉘 윈도우에 대한 인터페이스)는 파일과 비슷하지만 fileno 속성을 가진 실제 파일 핸들이 아니며 Unix 계열 운영 체제에서는 하위 프로세스의 stdin 또는 stdout으로 파일을 지정해야합니다. Windows 용으로는 말할 수 없지만 유사한 요구 사항이 있다고 생각합니다.

+0

IDLE은 pythonw.exe를 통해 실행되므로 콘솔'stdin','stdout' 및'stderr' 파일 핸들조차도 사용하지 않습니다. – eryksun

+0

하지만 파이썬을 속일 수있는 방법이 있습니까? – dmjalund

4

Taymon의 대답은 사용자의 질문을 직접적으로 해결합니다. IDLE의 stdin/stdout은 콘솔/터미널과 관련된 표준 파일 스트림이 아니라 실제로 파일과 유사한 객체입니다. 더욱이, Windows에서 IDLE은 pythonw.exe로 실행됩니다. pythonw.exe에는 첨부 된 win32 콘솔도 없습니다.

즉, 프로그램의 출력을 실시간으로 사용자에게 출력해야하는 경우 많은 경우 (전부는 아니지만) 한 줄씩 출력을 읽고 적절하게 에코 할 수 있습니다. 다음은 Windows IDLE에서 나를 위해 작동합니다. 그것은 라인별로 라인 stdout을 읽는 것을 보여줍니다. 또한 프로세스가 파이프를 버퍼링하면 어떤 일이 일어나는지 보여줍니다.이 경우 버퍼가 꽉 찼거나 파이프가 닫힐 때까지 readline이 차단됩니다. 이 버퍼링은 일부 프로그램 (예 : Python 인터프리터의 -u 옵션)을 사용하여 수동으로 비활성화 할 수 있으며 stdbuf과 같은 유닉스에 대한 해결 방법이 있습니다.

test1.py

import sys 
import subprocess 

def test(cmd): 
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
    it = iter(p.stdout.readline, b'') 
    for line in it: 
     print(line.rstrip().decode('ascii')) 

print('Testing buffered subprocess...') 
test([sys.executable, 'test2.py']) 

print('\nTesting unbuffered subprocess...') 
#-u: unbuffered binary stdout and stderr 
test([sys.executable, '-u', 'test2.py']) 

test2.py :

import time 

for i in range(5): 
    print(i) 
    time.sleep(1) 

는 IDLE의 출력은 지연 제 후 한꺼번에 인쇄 숫자의 제 1 세트를 사용하여 다음되어야 줄 단위로 인쇄됩니다.

Testing buffered subprocess... 
0 
1 
2 
3 
4 

Testing unbuffered subprocess... 
0 
1 
2 
3 
4 
관련 문제