Использование механизма Spawn-Expect в TCL-8.5 - PullRequest
0 голосов
/ 28 июня 2019
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

Я пытался использовать pipe в коде TCL.Но по какой-то причине я хочу преобразовать это в механизм Spawn-Expect.Но я борюсь с этим и сталкиваюсь с проблемами при этом.Может кто-нибудь, пожалуйста, помогите мне ??

1 Ответ

1 голос
/ 28 июня 2019

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 не выполняет автоматизацию графического интерфейса.Просто программы командной строки.Автоматизация графического интерфейса - гораздо более сложная тема.


Невозможно дать общее описание того, что можно сделать, так как это сильно зависит от того, что на самом деле делает программа Certify.exe, и от того, как вы работаете с ней.это в интерактивном режиме.

...