2012-01-03 2 views
1

내 파이썬 스크립트 내에서, 백그라운드에서 실행될 명령을 기다리는 다른 파이썬 스크립트를 시작하고 싶습니다.정상적으로 종료 될 때까지 백그라운드에서 실행되는 하위 프로세스는 어떻게 시작합니까?

  1. 호스트 파이썬 스크립트 (H1)는 서브 프로세스 P1을 시작합니다.
  2. P1은 단명 작업을 수행합니다. &은 종결 지시를 기다리는 중 취침 예정임을 나타내는 감시를 반환합니다.
  3. H1 폴링이 반복적으로 반복됩니다. 센티넬을 받으면 다른 IO 바인딩 작업을 수행하고 완료되면 P1이 정상적으로 종료되도록 지시합니다. 즉 획득 한 모든 리소스를 닫습니다.

하위 프로세스 모듈과 관련이 있습니까? 그런 다음 당신의 감시를 감시하고 자식 프로세스에게 메시지를 보낼 p.stdin에 쓸 p.stdoutp.stderr에서 읽을 수

p=subprocess.Popen([list for the script to execute], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

:

+2

당신이'multiprocessing' 모듈, 또는'threading' 모듈을하고 싶지 않아 이유가 있습니까? 'subprocess' 모듈을 사용하는 파이썬 인터프리터를 별도로 호출하는 것이 가능 합니다만 조금 복잡해집니다. – wim

+0

예, 나는 그것을 과도하게 복잡하게 만드는 직감이 있습니다. – canadadry

답변

1
"""H1""" 
from multiprocessing import Process, Pipe 
import sys 

def P1(conn): 
    print 'P1: some short lived work' 
    sys.stdout.flush() 
    conn.send('work done') 
    # wait for shutdown command... 
    conn.recv() 
    conn.close() 
    print 'P1: shutting down' 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=P1, args=(child_conn,)) 
    p.start() 
    print parent_conn.recv() 
    print 'H1: some other IO bound task' 
    parent_conn.send("game over") 
    p.join() 

출력 :

P1: some short lived work 
work done 
H1: some other IO bound task 
P1: shutting down 
2

예와 프로세스를 시작합니다. posix 시스템에서 실행중인 경우 대신 pexpect를 사용하는 것이 좋습니다. 그것은 MS 윈도우를 지원하지 않지만 자식 프로세스와 서브 프로세스보다 더 잘 통신합니다.

+0

스크립트는 Linux에서만 작동해야합니다. – canadadry

관련 문제