exp::winnt_debug ошибка родительского пространства имен

Я получаю сообщение об ошибке «can't set "::exp::winnt_debug": parent namespace doesn't exist», когда пытаюсь запустить свой ожидаемый скрипт, используя C-реализацию ожидаемого интерпретатора в Windows (expect543.dll). Однако тот же сценарий работает нормально, если я запускаю его с помощью команды ActiveState tclsh...

Оператор "set ::exp::winnt_debug 1" в скрипте является причиной ошибки. Любая идея, в чем может быть причина и как ее решить?

Пожалуйста, найдите код ниже

package require Expect
set ::exp::winnt_debug 1
set prompt "R4#"
set more " --More--"
expect -timeout 10 "$prompt"
set output [open result.txt "w"]
set running 1
spawn plink -telnet "144.21.12.45" -P 2004
send "enable\r"
send "\r"
send "show running-config\r"
send "\r"
while { $running  > 0 } {
expect {
    "\n"    { puts -nonewline $output "$expect_out(buffer)" }
    "$more"    {send " "}
    "lines *-* " { send " " }
    #"$prompt"   { set running 0 }
    eof     { set running 0 }
    timeout     { set running 0 }
}

}
puts "output is .."

person S_R    schedule 05.08.2013    source источник
comment
Как вы активируете код ожидания? package require? load?   -  person Donal Fellows    schedule 05.08.2013
comment
Я активировал его с помощью команды package require expect. Добавили код для справки.   -  person S_R    schedule 06.08.2013


Ответы (1)


Может быть несколько реализаций Expect для Windows (в отличие от версии Unix, которая была стабильной на протяжении веков), и похоже, что детали их внутренней реализации довольно сильно различаются между ними. Это не особенно удивительно. Кроме того, переменная ::exp::winnt_debug является абсолютно внутренней для конкретной реализации.

Немедленное исправление состоит в том, чтобы изменить строку с ошибкой на это:

catch {set ::exp::winnt_debug 1}

Таким образом, если он терпит неудачу, он молча терпит неудачу и не приводит к тому, что остальная часть программы не запускается. (Включение отладки не должно иметь никакого значения для запуска кода!)

В более общем плане либо используйте сборку ActiveState (и решите, как правильно упаковать все вместе, учитывая эту критическую зависимость), либо перестаньте ссылаться на ее внутренние функции. Это очень дурной тон - тыкать пальцами в реализацию пакета, поскольку никто никогда не брал на себя обязательств по их поддержке.

person Donal Fellows    schedule 06.08.2013