Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCL相当于Python';s`if_uuuname_uuu=="__主要的`_Tcl - Fatal编程技术网

TCL相当于Python';s`if_uuuname_uuu=="__主要的`

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

在一个可执行的TCL脚本中,我定义了一个变量,我想将该变量导入另一个可执行的TCL脚本中。在Python中,可以通过在脚本底部使用以下习惯用法来创建组合库和可执行文件:

# 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仅乍一看似乎很复杂。