在TCL-8.5中使用Spawn-Expect机制

时间:2019-06-28 05:32:23

标签: tcl expect

set pipeline [open "|Certify.exe args" "r"]
fconfigure $pipeline -blocking false
fconfigure $pipeline -buffering none
fileevent $pipeline readable [list handlePipeReadable $pipeline]


proc handlePipeReadable {pipe} {
if {[gets $pipe line] >= 0} {
# Managed to actually read a line; stored in $line now
} elseif {[eof $pipe]} {
    # Pipeline was closed; get exit code, etc.
    if {[catch {close $pipe} msg opt]} {
        set exitinfo [dict get $opt -errorcode]
    } else {
        # Successful termination
        set exitinfo ""
    }
    # Stop the waiting in [vwait], below
    set ::donepipe $pipe
} else {
    puts ""
    # Partial read; things will be properly buffered up for now...
    }
}

vwait ::donepipe

我尝试在TCL代码中使用管道。但是出于某种原因,我想将其转换为Spawn- Expect机制。但是我正在努力解决它,并在这样做时面临问题。谁能帮我吗?

1 个答案:

答案 0 :(得分:1)

期望使用法模式非常不同 ,它使用了与包装程序进行交互的不同方式,这更像是交互式用法的工作方式(该方法停止了一整类与缓冲相关的错误,我怀疑这可能是您要击中的目标)。因此,将事物转换为不是是一项直接更改。这是在简单情况下使用的基本模式:

package require Expect

# Note: different words become different arguments here
spawn Certify.exe args

expect "some sort of prompt string"
send "your input\r";   # \r is *CARRIAGE RETURN*
expect "something else"
send "something else\r"
expect eof

close

真正的复杂性是当您可以设置超时,一次等待多件事,等待模式以及文字字符串等时出现的。但是,与普通的Tcl一样(甚至忽略缓冲问题)也要做很多工作。实际上,几乎所有其他语言都需要更多工作。

请注意,Expect 不会执行GUI自动化。只是命令行程序。 GUI自动化是一个复杂得多的主题。


不可能给出一般性的描述,因为它很大程度上取决于Certify.exe程序的实际功能以及如何以交互方式使用它。