2011-08-24 5 views
4

들어오는 명령을 기다리는 백그라운드 프로세스를 만들어야합니다.Python의 백그라운드 프로세스

instance_tuple.popen = subprocess.Popen(['python',\ 
            os.path.join(config['scripts_dir'],\ 
            'instance_script.py')],\ 
            stdin = subprocess.PIPE,\ 
            stdout = subprocess.PIPE) 

프로세스 기능 코드 :

if __name__ == '__main__': 
    config = dict() 
    is_config_valid = False 
    print 'Hello from instance process' 
    while True: 
     cmd_str = raw_input() 
     if (cmd_str.strip() != ''): 
      print 'received %s' % cmd_str 
      command = json.loads(cmd_str) 
     print 'received command: %s' % str(command) 
     sys.stdout.flush() 
     if command['name'] == 'set_variable': 
      name = command['args'][0] 
      value = command['args'][1] 
      config[name] = value 
      is_config_valid = validate_instance_dict(config)    
     elif is_config_valid: 
      if (command['name'] == 'init_model'): 
       config['instance'].init_model() 
      elif (command['name'] == 'get_tree'): 
       tree = config['instance'].get_fidesys_tree(command['args']) 
       result = CommandResult(command.name, tree) 
    print 'process exit' 

내가 프로세스에 데이터를 전송하는 방법은 다음과 같습니다 여기 코드는 1 차 테스트 실행 괜찮 작동합니다

(input, errors) = instance_tuple.popen \ 
        .communicate(json.dumps({'name': 'name', 'args': list()})) 

나중에 어떤 이유로 raw_input()에 대한 EOF를 얻고 프로세스가 종료됩니다. 프로세스 간 통신을 설정하는 올바른 방법은 무엇입니까?

답변

5

여기에 zeromq을 사용하고 싶습니다. zmq.PULL 소켓을 사용하여 서버를 설정하여 zmq.PUSH 소켓을 사용하여 메시지를 보내는 클라이언트를 수신 대기합니다. 작업하기 정말 쉬운 : 당신이 "sys.stdin.readline()"대신에 raw_input의 사용하면 어떻게됩니까

import zmq 

def client(msg) 
    context = zmq.Context() 
    client = context.socket(zmq.PUSH) 
    client.connect('tcp://127.0.0.1:9999') 
    client.send(msg) 

def server(): 
    context = zmq.Context() 
    server = context.socket(zmq.PULL) 
    server.bind('tcp://127.0.0.1:9999') 

    while True: 
     msg = server.recv() 
     ..do something with each message 

if __name__ == '__main__': server() 
+0

덕분에, 나는 그로 살펴 보겠습니다. –

+0

MQ [비교 기사] (http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes)에서 파이썬 zeromq 확장이 깨졌습니다. 이 문제가 해결 되었습니까? –

+0

주목할 또 하나 :'pyzmq'는 json이나 pickled python 객체를 보내기위한 멋진 메소드를 가지고 있습니다. 또한 'client.send_json ({name': 'name', 'args': list()})'또는'client.send_pyobj()'를 호출한다. – zeekay

0

나는 communications()이 프로세스를 EOF로하는 stdin을 종료한다고 믿습니다.

여러 번 이야기하고 싶다면 popen.stdin.write (...)를 사용하십시오.

0

서브 프로세스 모듈을 사용하면 통신 기능을 사용할 수 없습니다.

pexpect 모듈을 사용하고 싶습니다. 더 쉬워! 예를 들어 아래
가있는 FTP 연결이 생성되고, 파이썬 스크립트는 생성 과정과 상호 작용 :

import pexpect 
import sys 

child = pexpect.spawn('ftp ftp.openbsd.org') 
child.expect('name .*: ') 
child.sendline('anonymous') 
child.expect('(password') 
child.sendline('[email protected]') 
child.expect('ftp> ') 
child.sendline('cd /pub/OpenBSD/3.7/packages/i386') 
... 
if child.isalive(): 
    child.sendline('bye') # Try to ask ftp child to exit. 
    child.close() 
관련 문제