【问题标题】:Using Spawn-Expect mechanism in TCL-8.5在 TCL-8.5 中使用 Spawn-Expect 机制
【发布时间】:2019-06-28 20:44:04
【问题描述】:
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 机制。但我正在努力解决它并在这样做时面临问题。谁能帮帮我?

【问题讨论】:

  • 什么问题?显示您的期望代码。
  • spawn "Certify.exe $parameters(0) $parameters(1) $parameters(2) $parameters(3) $parameters(4) $parameters(5) $parameters(6) $parameters (7) $parameters(8) $parameters(9) $parameters(10) $parameters(11) $parameters(12) $parameters(13) $parameters(14) $parameters(15)"
  • 使用 spawn 后,在关闭和打开应用程序实例时,加载 Java VM 时出现错误
  • 我也没有使用过期望,因为我现在没有在这种情况下如何使用期望

标签: tcl expect


【解决方案1】:

Expect 使得使用模式非常不同并且它使用不同的方式与被包装的程序进行交互,这更像是交互使用的工作方式(它阻止了一整类与缓冲相关的错误,我怀疑这可能是你要打的)。正因为如此,转换东西是不是一个插入式的改变。这是一个简单的例子的基本使用模式:

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 程序实际执行的操作,以及您如何以交互方式使用它。

【讨论】:

  • 非常感谢您的回答多纳尔。我相信这里的问题不在于 Certify 方面。因为当我在没有 TCL 的命令提示符下执行 Certify.exe args 时,脚本被触发并成功完成,并且控制正确地转移回命令提示符。而当我使用 tclsh 时,我正在观察这个问题,这意味着根本原因在于 TCL 正确...如果我的理解有误,请纠正我
  • 这里的另一个问题是,您在示例代码中使用了 expect 和 send 命令。但在我的情况下,我只需要触发我的脚本。在这种情况下,我如何使用期望和发送,因为我没有从命令提示符输入任何文本,也没有任何期望!!!你能澄清一下吗????
  • Vishal,我不记得您曾经说过您必须如何与 Certify 交互?是否有任何提示您必须输入一些信息?你需要捕获输出吗?你需要解析那个输出吗?您是否只想启动它而忘记它?
  • Glenn,我将调用 certify.exe 从测试引擎触发实际脚本(用 TCL 编写),在脚本执行完成后,控件应该返回到测试引擎。仅此而已我的要求是什么。此外,我们使用测试引擎来促进脚本的批量执行,这些脚本是在 Worksoft Cerify 工具的帮助下编写的。希望这能回答您的问题
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多