Tcl 访问在不同命名空间中打开的文件处理程序

Tcl 访问在不同命名空间中打开的文件处理程序,tcl,Tcl,如何访问/关闭在不同命名空间中打开的文件处理程序 例如: package provide MyProcs 1.0 namespace eval ::MyProcs { # Export commands namespace export run_my_proc } proc ::MyProcs::run_my_proc {log} { global log_fh set log_fh [open "log" "r"] } 可执行文件代码: lappend auto_pa

如何访问/关闭在不同命名空间中打开的文件处理程序

例如:

package provide MyProcs 1.0

namespace eval ::MyProcs {
# Export commands
namespace export run_my_proc
}

proc ::MyProcs::run_my_proc {log} {

    global log_fh
    set log_fh [open "log" "r"]

}
可执行文件代码:

lappend auto_path /path/to/my/package
package require ::MyProcs 1.0

MyProcs::run_my_proc "some_file_name"

close MyProcs::${log_fh}
然后获取此错误:


原始错误:找不到名为“MyProcs::log\u fh”的频道

当您声明
global log\u fh
时,
global
命令指定
log\u fh
在全局命名空间中,而不是在您的命名空间中。有几种方法可以解决此问题:

指定命名空间:

 global ::MyProcs::log_fh
使用
变量
命令(用于创建和初始化命名空间变量):


参考资料:,

我看不出您在哪里初始化日志。如果该变量不存在,您的程序将无法访问它。@BradLanam添加到代码示例除了Brad Lanam的建议外,请注意,您不能使用
MyProcs:${log\u fh}
访问
中的变量
log\u fh
。名称空间成为(限定的)变量名的一部分,如下所示:
close$::MyProcs::log\u fh
。在:MyProcs名称空间中计算的代码当然可以使用名称log\u fh,而不使用名称空间。@PeterLewerin不幸的是(对我来说),这不太正确。我使用了很多代码:
$sysvars::v(废话)
sysvars
是一个名称空间,而我目前在另一个名称空间中。显然,Tcl的变量查找算法处理得很好。这是一个我还没有完成的代码清理项目。正如您所指出的,使用完全限定名称无疑是一种最佳实践。是的,如果使用错误的方法,可能会在某些地方引起问题。@BradLanam:是的,如果您在
foobar
命名空间中,并尝试解析
sysvars::v(blah)
,解析程序首先在
foobar
中查找
sysvars
命名空间,然后在全局命名空间中查找。(). 我的评论主要是关于
MyProcs::${log\u fh}
表单。
 namespace eval ::MyProcs {
    variable log_fh
    ...
 }

 proc ::MyProcs::run { } {
    variable log_fh
    ...
 }