2013-05-03 189 views
0

我写运行下面的Python程序:多个“Gnome终端”与蟒蛇问题

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() 

FUN1正常工作,我等待3秒,因为它持续一段时间,直到一切是这样做的FUN2可以工作(我不能同时启动,fun2必须等待fun1,它永远不会结束fun2之前)

运行fun2时出现问题,我不知道错误在哪里,是“相同”代码在fun1中,但gnome终端只出现几毫秒,然后它消失...

有什么建议?

预先感谢您

+0

fun2窗口在fun2关闭后仍然有效吗? – ton1c 2013-05-03 09:39:41

+0

是的。 fun1窗口和fun2窗口都应该保持打开状态,因为在他们之后,我需要第三个窗口来执行其他命令。他们都是正在运行的进程来监听第三个进程要求的内容。我不知道为什么fun2窗口关闭... – flipmurry 2013-05-03 09:44:26

+0

您确定命令'gnome-terminal -x sh -c“rosrun rosserial_python serial_node.py/dev/ttyACM0”'是否有效?如果它不起作用,它会打印一条错误消息,然后终端将关闭。 – 2013-05-03 09:58:22

回答

0

的问题可能与"。将参数列表传递给子进程时,不需要使用这些参数。在运行之前它会被正确地转义。

该窗口正在关闭,因为生成的命令可能格式不正确,从而生成错误并立即退出。

因此,如果您有要运行的文字命令,则可以使用shlex.split生成传递给子流程的适当列表。通常,您不必担心引号和转义字符。因此,为了传递空间作为参数,只需写一个空格。

+0

ton1c,我不明白...我发送给gnome-terminal的命令必须像这样: (for fun1): >> gnome-terminal --tab -x sh -c“roscore” (for fun2): >> gnome-terminal --tab -x sh -c“rosrun rosserial_python serial_node.py/dev/ttyACM0” 如果我直接在gnome-terminal中运行它们,它们都可以很好地工作,窗户不关闭,他们一直期待着我必须通过他们的其他事情...因为它必须是!但是问题出在python程序,不知道为什么窗口从fun2关闭...... :( – flipmurry 2013-05-03 09:57:52

+0

不,你不明白我的意思,试试这个:'print subprocess.list2cmdline(['gnome-terminal', '-x','sh','-c',''roscore''))''然后复制粘贴到终端模拟器,它将不起作用。删除双引号,它会。 – jadkik94 2013-05-03 09:58:31

+0

@ jadkik94对不起,我做了你说的,它的工作原理,对我的新手感到抱歉:( 你们是伟大的!! – flipmurry 2013-05-03 10:03:46