我在Windows上安装了两个Tcl 8.4。这是一个看起来不错的人:
(在tclsh内):
% set auto_path
c:/Tcl/lib/tcl8.4 c:/Tcl/lib
% package require csv
0.8
包csv位于:
dir c:\Tcl\lib\tcllib1.15\csv
06.06.2013 07:52 20.154 csv.tcl
06.06.2013 07:52 126 pkgIndex.tcl
这是另一个无法找到csv包的地方:
% set auto_path
C:/cygwin64/home/fisrona/gitwrk/vp/lib/tcl8.4 C:/cygwin64/home/fisrona/gitwrk/vp/lib
% package require csv
can't find package csv
在此安装中,包位于此处:
dir C:\cygwin64\home\fisrona\gitwrk\vp\lib\tcllib1.15\csv
03.02.2015 08:59 20.154 csv.tcl
03.02.2015 08:59 126 pkgIndex.tcl
在这两种情况下,auto_path都包含lib目录,包位于lib目录下的tcllib1.15 / csv。 pkgIndex.tcl在两种情况下都是相同的,如下所示:
if {![package vsatisfies [package provide Tcl] 8.4]} {return}
package ifneeded csv 0.8 [list source [file join $dir csv.tcl]]
两个安装之间必定存在不同之处,导致第二个安装失败。任何想法可能是什么原因?
BTW,两个安装中的init.tcl(在两个案例中都位于lib / tcl8.4中)也是相同的。当然,如果我将tcllib1.15目录显式添加到auto_path,则会找到包;但为什么在第一种情况下找到包,我没有添加这个目录,但在第二种情况下却没有?==========
新发现:
在 good 安装中,当我需要一个不存在的包,然后再次显示auto_path时,我得到以下结果:
% set auto_path
c:/Tcl/lib/tcl8.4 c:/Tcl/lib
% package require xxx
can't find package xxx
% set auto_path
c:/Tcl/lib/tcl8.4 c:/Tcl/lib c:/Tcl/lib/tcllib1.15 c:/Tcl/lib/tcllib1.7 c:/Tcl/lib/tklib0.6 c:/Tcl/lib/vfs1.4.2/template
当需要一个未知的包时,它看起来像一个处理程序,并且这个处理程序扩展了auto_path。特别是,添加了目录tcllib1.15,其中包含csv目录。如果我在"坏"安装,我看到了:
% package require xxx
can't find package xxx
% set auto_path
C:/cygwin64/home/fisrona/gitwrk/vp/lib/tcl8.4 C:/cygwin64/home/fisrona/gitwrk/vp/lib C:/cygwin64/home/fisrona/gitwrk/vp/lib/tcllib1.7
在这种情况下,只添加了一个目录,而这不是包含csv文件的目录。
差异似乎是"未知包处理的方式"正在扩展auto_path。我只是想知道,在哪里可以找到这个处理程序?我在init.tcl中找到了以下命令:
package unknown [list ::tcl::tm::UnknownHandler [package unknown]]
我在lib / tcl8.4 / tm.tcl中找到了这个处理程序。这两个版本的文件也相同。
看起来我必须手动执行UnknownHandler以了解发生了什么......我将在此处报告我的发现。
答案 0 :(得分:0)
解决!!!!!啊,这是一个多么愚蠢的错误:
虽然在两个安装中, csv目录都有一个pkgIndex.tcl文件,但在 tcllib1.15 目录中已破坏的安装中缺少此文件。
当包需要csv 时,调用了handler :: tcl :: tm :: UnknownHandler,无法解析它,但随后标准处理程序(由[package unknown]返回)启动这是我在tcl8.4 / package.tcl中的安装中定义的过程 tclPkgUnknown 。此过程搜索auto_path中找到的目录中的所有条目。如果其中一个目录有一个子目录,还有一个pkgIndex.tcl文件,该文件中的条目也被考虑(并且该目录被添加到auto_path中)。
解决方案:我必须为我的目录tcllib1.15提供合适的pkgIndex.tcl。