2012-06-12 4 views
4

main.py파이썬, 서브 프로세스에서 입력을 얻으려고합니까?

import subprocess,sys 
process = subprocess.Popen([sys.executable]+['example.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

while True: 
    out = process.stdout.read(1) 
    if not out: 
     out=process.stderr.read(1) 
    if out == '' and process.poll() != None: 
     break 
    if out != '': 
     print out 

example.py

f=raw_input('WHats your favorite animal') 

내가 내 메인 루프에 입력을 확인하고 일부 데이터를 제공 할 수있는 방법을 궁금해하고 확인을 클릭합니다. 지금 raw_input을 사용할 때 프로그램이 멈 춥니 다. 여기

내가 이런 기능이 있는지 잘 모릅니다

while True: 
    out = process.stdout.read(1) 
    if not out: 
     out=process.stderr.read(1) 
    if out == '' and process.poll() != None: 
     break 
    #showing what i want 
    if request_input==True: 
     give_input('cat') #Give input to the raw_input 
    # 
    if out != '': 
     print out 

을하고 싶은 것입니다. 더 자세한 설명이 필요하면 의견을 말하십시오.

+0

관련 : http://stackoverflow.com/questions/375427/non-blocking-read-on-a

여기
f=raw_input('WHats your favorite animal') print f.upper() 

당신을 위해 pexpect-example.py 찾고있다 -subprocess-pipe-in-python – ChristopheD

+0

나는 이것을 사용하기 위해서 C++을 사용하기까지한다. IDLE.py는 어떻게 작동합니까? – user1357159

답변

4

이것은 프로세스 간 통신을하는 가장 좋은 방법은 아닙니다. 다중 처리 또는 통신 및 동기화를 위해 대기열 또는 PIPE와 같은 라이브러리를 사용하는 것이 좋습니다.

대기열은 데이터를 공유하는 가장 간단한 방법이며 한 프로세스는 값을 넣고 다른 프로세스는 값을 가져옵니다. 지금 작동 있도록

나는, ..., 등의 경우 프로그래머 아무것도로하지 플러시 표준 출력이이 중단됩니다 않는 코드는 단지 표준 출력을 기다리는 이유입니다 http://code.activestate.com/lists/python-list/265749/을 그 raw_input을주의 원래의 코드를 수정 한

위험하므로 교착 상태가 발생할 수 있으며 책임지고 사용하십시오. 다른 방법을 시도해보십시오.

import sys 
print 'Whats your favorite animal\n' #raw_input doesn't flush :(and we want to read in a whole line 
sys.stdout.flush() 
f = raw_input() 
print f 

하고 해당 main.py

import subprocess, sys, os 
process = subprocess.Popen([sys.executable]+['example.py'], 
    stdout = subprocess.PIPE, stderr = subprocess.PIPE, stdin = subprocess.PIPE) 

while True: 
    if process.poll() != None: 
     break 
    request_input = process.stdout.readline() # read line, this will wait until there's actually a line to read. 
    if request_input == "Whats your favorite animal\n": 
     print 'request: %s sending: %s' % (request_input, 'cat') 
     process.stdin.write('cat\n') 
     process.stdin.flush() 
+0

"request_input =="가장 좋아하는 동물은 무엇입니까? \ n ":", 저는 raw_input 함수가 액세스 된 일반적인 경우를 찾고 있습니다. – user1357159

+0

raw_input이 일반적으로하는 일이 조금 더 까다로운 이유는 파일 설명자 객체에서 readline을 호출하는 stdin에서 읽은 것입니다. 파일이 열려 있는지 확인하려고했으나 실행이 시작되면 자동으로 열렸습니다. (미안 해요. 당신이 정말로 raw_input을 필요로하지 않는 한 다중 처리/스레딩 아마 최고 ... –

+0

아, 내가 어떤 솔루션을 열어, 내가 뭘하려고하는지 재미 파이썬 IDE입니다. 중요한 건 그래서 내가 필요 하리라 생각합니다. 아픈 것 같아요. 답장을 다시 보내 주셔서 감사합니다. – user1357159

1

편집 : 나는 그것에 대해 죄송합니다 귀하의 질문에, missunderstood 같은이 보인다.

이 당신이 생각하는 것만 큼 쉬운 일이 아닙니다 :

당신은 stdin에서 사용할 수있는 데이터가 있는지 확인하는 select를 사용해야 할 데이터가있을 경우, 그것을 읽을!

최소 예 :

STDIN, STDOUT = 0, 1 

while not process.poll() is None: 
    out = process.stdout.read(1) 

    if not out: 
     break 

    try: 
     fds = select.select([STDIN], [], [])[0] 
    except select.error: 
     pass 
    else: 
     if STDIN in fds: 
      data = os.read(STDIN, 1024) 

      if data_requested: 
       process.stdin.write(data) 

정보 선택 : http://docs.python.org/library/select.html#module-select, http://linux.die.net/man/2/selecthttp://en.wikipedia.org/wiki/Select_(Unix)

윈도우 그냥 소켓에 select을 지원하기 때문에이, 창에 작동하는지 확실하지. SO에 관련 질문 : 당신이 "원시 파이썬"을 주장하지 않는 한 What is the best epoll/kqueue/select equvalient on Windows?

0

시도는 멀티 프로세싱 모듈을

from multiprocessing import Process, Value, Array 

def f(n, a): 
    n.value = 3.1415927 
    for i in range(len(a)): 
     a[i] = -a[i] 

if __name__ == '__main__': 
    num = Value('d', 0.0) 
    arr = Array('i', range(10)) 

    p = Process(target=f, args=(num, arr)) 
    p.start() 
    p.join() 

    print num.value 
    print arr[:] 
0

를 사용하는 것이 가장 좋은는 pexpect 모듈을 사용하는 것입니다. 나는 당신의 example.py에 결과물을 추가했다. 그렇지 않으면 전혀 재미 없다.

다음은 예입니다.평 :

# see http://pexpect.sourceforge.net/pexpect.html 
    import pexpect 

    PY_SCRIPT = 'example.py' 

    child = pexpect.spawn('python %s' % PY_SCRIPT) 

    child.expect ('WHats your favorite animal') 

    # comment out these three lines if you run unmodified example.py script 
    child.setecho(False) 
    child.sendline ('cat') 
    print PY_SCRIPT, 'said:', child.readline() 
+0

print f.upper() 호출이 필요하지 않습니다. abb는 스크립트 출력을 확인하기 위해 출력을 표시하기 위해 추가 한 것입니다. 대답의 중요한 부분 인 pexpect 모듈은 거의 확실하게 가장 강력한 솔루션입니다. – dimo414

+0

죄송합니다. 답변을 살펴 보았습니다. 필자는 그것과 그 멋진 모습을 보았지만, pexpect가 사용하는 모듈 때문에 리눅스에서만 작동한다. – user1357159

+0

또한 raw_input 경우를 찾고 있기 때문에 "child.expect ('좋아하는 동물은 뭐니?')를 사용하면 나에게 적합하지 않습니다. – user1357159

관련 문제