处理tcl / expect中的多个进程

时间:2015-12-02 19:21:11

标签: tcl expect

我正在尝试处理两个必须同时运行的进程。但是,我不断收到其中一个进程不存在的消息。

这是一个最小的(不是)工作示例(我实际上并不是在使用ftp,但那将是为其他人运行的东西):

def OnToggleStatusBar(self, event):
    id = event.GetId()
    menu = event.GetEventObject()
    menuItem = menu.FindWindowById(id) #does not work
    print self.FindByWindowId(id) # prints None

不幸的是,输出是:

#!/usr/bin/expect

set spawn_id_bash [spawn /bin/bash]
set spawn_id_ftp [spawn ftp ftp.ccc.de]

send "anonymous\n"
expect {
    "*Password*" {
            puts "\nftp works"
    }
    default {
            puts "\nftp defaulted"
    }
}

set spawn_id $spawn_id_bash
send "uname\n"
expect {
    "*Linux*" {
            puts "\nbash works"
    }
    default {
            puts "\nbash defaulted"
    }
}

我在编写这个例子时已经按照了"Exploring Expect"这本书,我不知道我的做法有何不同。

我也尝试过使用[martin@martin linuxhome]$ /tmp/blub.tcl spawn /bin/bash spawn ftp ftp.ccc.de anonymous Trying 212.201.68.160... Connected to ftp.ccc.de (212.201.68.160). 220-+-+-+-+-+-+-+-+-+ 220-|o|b|s|o|l|e|t|e| 220-+-+-+-+-+-+-+-+-+ 220- 220- 220-Please use HTTP instead: 220- 220-* http://cdn.media.ccc.de 220 Name (ftp.ccc.de:martin): 331 Please specify the password. Password:ftp works can not find channel named "4648" while executing "send "uname\n"" (file "/tmp/blub.tcl" line 19) send -i而没有任何运气(错误消息已消失,但其他expect -i似乎被忽略了。)

1 个答案:

答案 0 :(得分:1)

spawn返回unix进程id(PID,一个整数),而不是spawn_id(一个字符串)。例如:

# cat foo.exp
send_user "[spawn -noecho sleep 1] $spawn_id\n"
expect eof
# expect foo.exp
20039 exp6
#

所以你应该这样写:

spawn /bin/bash
set spawn_id_bash $spawn_id

spawn ftp ftp.ccc.de
set spawn_id_ftp $spawn_id

然后您可以使用expect -isend -i