关于Tcl中源代码的一个问题

关于Tcl中源代码的一个问题,tcl,Tcl,我有一个名为test7.tcl的文件: namespace eval ::dai { variable name "ratzip" variable birthday "1982" proc hello {} { variable name variable birthday puts "Hello, I am $name birthday is $birthday" } } 我想将此文件源代码转换为另一个文件,名为test8.tcl

我有一个名为test7.tcl的文件:

namespace eval ::dai {
   variable name "ratzip"
   variable birthday "1982"
   proc hello {} {
      variable name
      variable birthday
      puts "Hello, I am $name birthday is $birthday"
   }
}
我想将此文件源代码转换为另一个文件,名为test8.tcl,方法如下:

source test7.tcl

::dai::hello
但它给了我一个错误:无法读取文件“test7.tcl”:没有这样的文件或目录


但是这两个文件在同一个文件夹下,发生了什么事?

您不必指定要源文件的路径相对于
test8.tcl的路径,而是相对于当前工作目录。例如,使用绝对路径:

source /path/to/test7.tcl

使用
source[file join[file dirname[info script]]test7.tcl]
——这样,您就可以通过从执行
source
的文件的完整路径名构造的完整路径名来获取目标文件的源代码;无论在执行过程中您的当前目录是什么,这都将起作用。

若要获取与当前执行脚本位于同一目录中的文件,请使用以下命令:

source [file join [file dirname [info script]] "test7.tcl"]

请注意,这在外部脚本(在您的示例中为test8.tcl)中定义的过程中不起作用,因为它们通常在源代码完成后调用。如果是这样的话,最简单的修复方法就是将
info script
的输出保存在外部脚本中的一个变量中(或者立即而不是懒洋洋地获取所有文件,以获得最终的最佳方法)。

我打赌您没有像这样运行test8.tcl:
tclsh test8.tcl
source test8.tcl
。相反,您位于不同的目录中,因此文件名不是您所期望的。使用
文件normalize test7.tcl进行诊断,查看完整文件名是否符合预期。