2013-08-05 36 views
0

當我嘗試在Windows(expect543.dll)上使用C實現期望解釋器來運行我的期望腳本時,出現錯誤「can't set "::exp::winnt_debug": parent namespace doesn't exist」。 但是,如果我運行它通過ActiveState的命令tclsh的同一腳本正常工作......exp :: winnt_debug父命名空間錯誤

腳本語句「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 .." 
+0

你如何激活Expect代碼? '包要求'? 'load'? –

+0

我使用命令「package require expect」激活了它。已添加代碼供您參考。 –

回答

0

有可能是期待的Windows(不像Unix版本,這一直是穩定的年齡)的幾種實現方式,它聽起來就像他們是如何在內部實現的細節他們之間差異很大。這並不奇怪。此外,變量::exp::winnt_debug絕對是內部的特定實現。

眼前的解決辦法是有錯誤的行改成這樣:

catch {set ::exp::winnt_debug 1} 

這樣的,如果失敗的話,它靜靜地失敗並不會導致程序無法運行的其餘部分。 (啓用調試應該不會影響代碼是否運行!)

更一般地說,要麼使用ActiveState構建(並且解決如何以正確的方式將事物打包在一起,注意關鍵依賴關係),要麼停止指的是它的內部特徵。在執行一個軟件包的過程中戳動你的手指是非常糟糕的形式,因爲沒有人承諾支持它們。