2012-04-30 5 views
2

"명령"모드에서 소프트웨어를 실행하는 하위 프로세스를 실행 중입니다. (이 소프트웨어는 Nuke by The Foundy가 소프트웨어를 아는 경우를 위해)실행중인 python 하위 프로세스와 통신합니다.

이 소프트웨어는 사용자 입력을 기다리고 있습니다. 이 모드에서는 UI없이 합성 스크립트를 만들 수 있습니다.

나는이 프로세스를 시작하는 코드를 수행했는데, 응용 프로그램이 시작될 때 찾아서 몇 가지 명령을 보내려고했지만 stdin이 명령을 제대로 보내지 않는 것 같습니다.

여기이 샘플 코드에서이 프로세스를 테스트했습니다. 표준 입력이 제대로 명령을 전송되지 않는 이유

sylvain.berger core/$ nuke -V -t 
[...] 
Loading /Applications/Nuke6.3v3/Nuke6.3v3.app/Contents/MacOS/plugins/getenv.tcl 
>>> import nuke 
>>> print nuke 
<module 'nuke' from '/Applications/Nuke6.3v3/Nuke6.3v3.app/Contents/MacOS/plugins/nuke/__init__.pyc'> 
>>> quit() 
sylvain.berger core/$ 

어떤 생각을 :

import subprocess 

appPath = '/Applications/Nuke6.3v3/Nuke6.3v3.app/Nuke6.3v3' readyForCommand = False 

commandAndArgs = [appPath, '-V', '-t'] 
commandAndArgs = ' '.join(commandAndArgs) 
process = subprocess.Popen(commandAndArgs, 
          stdin=subprocess.PIPE, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.STDOUT, 
          shell=True,) 

while True: 
    if readyForCommand: 
     print 'trying to send command to nuke...' 
     process.stdin.write('import nuke') 
     process.stdin.write('print nuke') 
     process.stdin.write('quit()') 
     print 'done sending commands' 
     readyForCommand = False 
    else: 
     print 'Reading stdout ...' 
     outLine = process.stdout.readline().rstrip() 
     if outLine: 
      print 'stdout:', outLine 

      if outLine.endswith('getenv.tcl'): 
       print 'setting ready for command' 
       readyForCommand = True 

    if outLine == '' and process.poll() != None: 
     print 'in break!' 
     break 

print('return code: %d' % process.returncode) 

내가 쉘에서 핵을 실행하고 여기에 같은 명령을 보낼 내가 무엇을 얻을? 감사

답변

3

없는 줄 바꿈으로 텍스트

import nukeprint nukequit() 

보내드립니다 코드, 따라서 파이썬 인스턴스는 모든 것이 줄 바꿈을 기다리는 버퍼에 앉아있다, 아무것도 실행하려고하지 않습니다

0

subprocess 모듈은 대화 형을위한 것이 아닙니다. 프로세스와의 통신. 기껏해야, 당신은 그것을 하나의 미리 계산 된 표준 입력 문자열을 제공하고 자사의 표준 출력과 표준 에러 읽을 수 있습니다 : 당신이 실제로 상호 작용을해야하는 경우

p = Popen(..., stdin=PIPE, stdout=PIPE, stderr=PIPE) 
out, err = p.communicate(predefined_stdin) 

, pexpect 사용을 고려합니다.

+0

-1. 서브 프로세스 모듈 _은 대화식 통신을위한 것입니다. 비 대화식 경우에'os.system'을 사용하십시오. – tobyodavies

+1

복잡한 출력과 입력 상호 작용이있을 때 문제가 발생하여 서브 프로세스가 사용하는 파이프가 채워집니다. 간단한 경우 하위 프로세스가 작업을 수행합니다 (누락 된 줄 바꿈에 대한 대답은 물론 맞습니다). 나는 그것이 털이되면, 서브 프로세스가 결국 한계를 넘을 수 있다고 말하고 있습니다. – torek