2013-05-03 5 views
0

나는 다음과 같은 실행 파이썬 프로그램을 쓰고 있어요 : 그것은 언젠가 지속하기 때문에 모든 것이 완료 될 때까지 제대로 작동 fun1여러 "그놈 터미널"파이썬 문제에

import subprocess 
import time 


def fun1(): 
    terminal1 = ['gnome-terminal'] 
    terminal1.extend(['-x', 'sh', '-c', '"roscore"']) 
    pid = subprocess.Popen(terminal1, stdout=subprocess.PIPE) 
    time.sleep(3) 
    print "success1" 
    fun2() 





def fun2(): 
    terminal2 = ['gnome-terminal'] 
    terminal2.extend(['-x', 'sh', '-c', '"rosrun rosserial_python serial_node.py /dev/ttyACM0"' ]) 

    pid2 = subprocess.Popen(terminal2, stdout=subprocess.PIPE) 
    print "success2" 

fun1() 

, 나는 3 초를 기다립니다되도록 Fun2에 (둘 다 동시에 시작할 수는 없지만 fun2는 fun2 전에 끝나지 않는 fun1을 기다려야합니다.)

fun2를 실행할 때 문제가 발생하면 어디에서 실수인지, "같은" 코드는 fun1과 같지만 그놈 터미널은 몇 밀리 초 동안 만 나타난 다음 사라집니다.

제안 사항 ??

는 문제가 "와 아마 사전

+0

fun2가 닫힌 후에도 fun1 창이 계속 작동합니까? – ton1c

+0

예. fun1 창과 fun2 창은 다른 명령을 수행하는 데 3 번째 창이 필요하기 때문에 열어 두어야합니다. 둘 다 프로세스가 무엇인지 듣기 위해 실행중인 프로세스입니다. fun2 창이 닫히는 이유를 모르겠다. ... – flipmurry

+0

'gnome-terminal -x sh -c "rosrun rosserial_python serial_node.py/dev/ttyACM0"'명령이 제대로 작동합니까? 작동하지 않으면 오류 메시지가 출력되고 그 후에는 터미널이 닫힙니다. –

답변

0

에 감사합니다. 하위 프로세스에 매개 변수 목록을 전달할 때 이러한 매개 변수를 사용할 필요가 없습니다. 실행되기 전에 제대로 이스케이프 처리됩니다.

생성 된 명령이 잘못되어 오류가 발생하여 즉시 종료되므로 창이 닫힙니다.

따라서 실행하려는 리터럴 명령이있는 경우 shlex.split을 사용하여 하위 프로세스로 전달할 적절한 목록을 생성 할 수 있습니다. 대개 따옴표 나 이스케이프 문자는 걱정할 필요가 없습니다. 따라서 공간을 인수로 전달하려면 공백을 씁니다.

+0

ton1c, 이해가 안됩니다 ... 그놈 터미널에 보내는 명령은 문자 그대로 다음과 같아야합니다. (fun1) : >> gnome-terminal --tab -x sh -c "roscore" (fun2 용) : >> gnome-terminal --tab -x sh -c "rosrun rosserial_python serial_node.py/dev/ttyACM0" 그놈 터미널에서 직접 실행하면 둘 다 완벽하게 작동합니다. 창문이 닫히지 않고 그들이 통과해야하는 다른 것들을 기대하고 있습니다. 하지만 문제는 파이썬 프로그램에서, fun2가 닫히는 이유를 모르겠다. ( – flipmurry

+0

아니, 무슨 뜻인지 이해하지 못했다. 다음을 시도해보십시오 :'print subprocess.list2cmdline ([ 'gnome-terminal', '-x', 'sh', '-c', 'roscore' '])'그런 다음 붙여 넣기를 터미널 에뮬레이터에 복사하면 작동하지 않을 것입니다. 큰 따옴표를 제거하면됩니다 .. – jadkik94

+0

@ jadkik94 죄송합니다, 나는 당신이 말한대로 행동하고 미안하다. ( 너희들은 위대하다! – flipmurry