TCL相当于Python';s`if_uuuname_uuu=="__主要的`
在一个可执行的TCL脚本中,我定义了一个变量,我想将该变量导入另一个可执行的TCL脚本中。在Python中,可以通过在脚本底部使用以下习惯用法来创建组合库和可执行文件:TCL相当于Python';s`if_uuuname_uuu=="__主要的`,tcl,Tcl,在一个可执行的TCL脚本中,我定义了一个变量,我想将该变量导入另一个可执行的TCL脚本中。在Python中,可以通过在脚本底部使用以下习惯用法来创建组合库和可执行文件: # Library if __name__ == "__main__": # Executable that depends on library pass TCL是否有类似的产品 Tcl的等效方法是将::argv0全局变量与info script命令的结果进行比较 if {$::argv0 eq [info
# Library
if __name__ == "__main__":
# Executable that depends on library
pass
TCL是否有类似的产品 Tcl的等效方法是将
::argv0
全局变量与info script
命令的结果进行比较
if {$::argv0 eq [info script]} {
# Do the things for if the script is run as a program...
}
::argv0
global(技术上是标准的tclsh
和wish
shell的一个功能,或者在C级调用Tcl\u Main
或Tk\u Main
的任何东西)具有主脚本的名称,或者如果没有主脚本,则为空字符串。info script
命令返回当前正在评估的文件的名称,无论是由source
还是因为主shell正在将其作为脚本运行。当当前脚本是主脚本时,它们将是相同的
正如Calvin先生在下面的评论中所指出的,如果您的库脚本有时在未设置
argv0
的上下文中使用(自定义shell、子解释器、嵌入式解释器、某些应用程序服务器等),那么您应该先添加多一点检查:
if {[info exists ::argv0] && $::argv0 eq [info script]} {
# Do the things for if the script is run as a program...
}
我最近想让这个功能为我的HDL构建脚本套件设置一些单元测试。这就是我给Vivado的结局:
proc is_main_script {} { ;# +1 frame
set frame [info frame [expr [info frame] -3]]
if {![dict exists $frame file]} {
set command [file normalize [lindex [dict get $frame cmd] 1]]
set script [file normalize [info script]]
if {$script eq $command} {
return 1
} else {
return 0
}
} else {
return 0
}
}
if {is_main_script} { ;# +1 frame
puts "do your thing"
}
当我考虑这个测试/演示时,我认为主要用例是符合<代码>的,如果{iSnMemaScript }把“做某事”} /代码>“未嵌套”,在文件的结尾。
如果需要使其更通用,可能会为框架
参考-3
开发一个动态句柄。尽管到目前为止,这已经涵盖了我的所有用例
frame
-3
用作proc
,如果创建了额外的帧,则要对此进行评估,我们需要在调用之前检查调用
dict exists
用于检查帧内是否存在file
。这将表明调用来自更高层次的脚本,并且不会有“main_脚本”
如果{[info exists::argv0]&&$:argv0 eq[info script]}
作为vivado-source TCLSCRIPT.tcl
运行,那么解决方案非常有效,但是上面的解决方案涵盖了gui或tcl模式下的source TCLSCRIPT.tcl
(这是调试自动化tcl时我经常自己做的事情)
我想这是一个利基案例。但是因为我找不到解决这个问题的其他方法,所以我想把这个留在这里 如果{[info exists::argv0]&&&$::argv0 eq[info script]}
,您可能需要进行泛化以获得,以使您的脚本不会在不运行Tcl\u Main
(例如,NaviServer,一些嵌入式Tcl)的环境中出现。谢谢您的回答!我无意中发现,它试图以各种复杂的方式[file normalize[info script]/…]
;这是必要的吗?是的,这是一个很好的实践,当您使用相对路径等时,它有助于避免在角落案例中出现混淆。文件dirname
和文件normalize
mambo jumbo仅乍一看似乎很复杂。