无法从用Tcl编写的应用程序中找到软件包

问题描述 投票:0回答:1

在读取软件包的documentation时,似乎有一个存储软件包的特定目录(?)。但是,我没有看到tcl_pkgPath,也没有看到auto_path

thufir@dur:~/tcl/packages$ 
thufir@dur:~/tcl/packages$ printenv | grep tcl*
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
PWD=/home/thufir/tcl/packages
OLDPWD=/home/thufir/tcl
thufir@dur:~/tcl/packages$ 
thufir@dur:~/tcl/packages$ printenv | grep auto*
XAUTHORITY=/run/user/1000/gdm/Xauthority
thufir@dur:~/tcl/packages$ 

为什么telnet.tcl无法在weather文件(位于同一目录中)中找到weather.tcl程序包?

thufir@dur:~/tcl/telnet$ 
thufir@dur:~/tcl/telnet$ tclsh telnet.tcl 
can't find package weather 1.0
    while executing
"package require weather 1.0"
    (file "telnet.tcl" line 4)
thufir@dur:~/tcl/telnet$ 
thufir@dur:~/tcl/telnet$ cat telnet.tcl 
#!/usr/bin/expect -f
#!usr/bin/expect
package require Expect
package require weather 1.0


thufir@dur:~/tcl/telnet$ 
thufir@dur:~/tcl/telnet$ cat weather.tcl 
package provide weather  1.0
package require Tcl      8.5

namespace eval ::util {
    namespace connect
    variable server
}

proc ::weather::connect {} {
spawn telnet rainmaker.wunderground.com

expect -nocase "Press Return to continue:"
send "\r"

puts "done"
}
thufir@dur:~/tcl/telnet$ 

另请参见:

https://www.tcl.tk/man/tcl8.5/tutorial/Tcl31.html

导入对我来说似乎是正确的。。

为清楚起见,我复制/粘贴了上面的示例:

thufir@dur:~/tcl/packages$ 
thufir@dur:~/tcl/packages$ ll
total 16
drwxrwxr-x 2 thufir thufir 4096 May  4 02:22 ./
drwxrwxr-x 6 thufir thufir 4096 May  4 02:22 ../
-rw-rw-r-- 1 thufir thufir  215 May  4 02:21 foo.tcl
-rw-rw-r-- 1 thufir thufir 1207 May  4 02:20 tutstack.tcl
thufir@dur:~/tcl/packages$ 
thufir@dur:~/tcl/packages$ cat foo.tcl 
package require tutstack 1.0

set stack [tutstack::create]
foreach num {1 2 3 4 5} { tutstack::push $stack $num }

while { ![tutstack::empty $stack] } {
    puts "[tutstack::pop $stack]"
}

tutstack::destroy $stack
thufir@dur:~/tcl/packages$ 
thufir@dur:~/tcl/packages$ cat tutstack.tcl 
# Register the package
package provide tutstack 1.0
package require Tcl      8.5

# Create the namespace
namespace eval ::tutstack {
    # Export commands
    namespace export create destroy push pop peek empty

    # Set up state
    variable stack
    variable id 0
}

# Create a new stack
proc ::tutstack::create {} {
    variable stack
    variable id

    set token "stack[incr id]"
    set stack($token) [list]
    return $token
}

# Destroy a stack
proc ::tutstack::destroy {token} {
    variable stack

    unset stack($token)
}

# Push an element onto a stack
proc ::tutstack::push {token elem} {
    variable stack

    lappend stack($token) $elem
}

# Check if stack is empty
proc ::tutstack::empty {token} {
    variable stack

    set num [llength $stack($token)]
    return [expr {$num == 0}]
}

# See what is on top of the stack without removing it
proc ::tutstack::peek {token} {
    variable stack

    if {[empty $token]} {
    error "stack empty"
    }

    return [lindex $stack($token) end]
}

# Remove an element from the top of the stack
proc ::tutstack::pop {token} {
    variable stack

    set ret [peek $token]
    set stack($token) [lrange $stack($token) 0 end-1]
    return $ret
}
thufir@dur:~/tcl/packages$ 
thufir@dur:~/tcl/packages$ tclsh foo.tcl 
can't find package tutstack 1.0
    while executing
"package require tutstack 1.0"
    (file "foo.tcl" line 1)
thufir@dur:~/tcl/packages$ 

但它是相同的语义

错误。

在阅读软件包的文档时,似乎有一个存储软件包的特定目录(?)。但是,我没有看到tcl_pkgPath,也没有看到auto_path:thufir @ dur:〜/ tcl / packages $ ...

scripting package tcl expect telnet
1个回答
0
投票

问题是Tcl找不到您的程序包的索引文件(应称为pkgIndex.tcl)。如果您已经将weather 1.0包实现为文件weather.tcl,那么您可能会希望拥有一个类似这样的索引文件在同一目录中

© www.soinside.com 2019 - 2024. All rights reserved.