当前TCL脚本的完整路径

时间:2010-10-01 11:08:20

标签: tcl

是否有可能获得当前正在执行的TCL脚本的完整路径?

在PHP中,它将是:__FILE__

5 个答案:

答案 0 :(得分:15)

根据“当前正在执行的TCL脚本”的含义,您实际上可能会寻找info script,甚至可能info nameofexecutable或更深奥的东西。

答案 1 :(得分:13)

检索当前语句所在文件名的正确方法是(真正等同于PHP / C ++' s __FILE__):

set thisFile [ dict get [ info frame 0 ] file ]

Psuedocode(它是如何工作的):

  1. set thisFile <value>:将变量thisFile设置为value
  2. dict get <dict> file:从dict
  3. 返回文件值
  4. info frame <#>:返回一个dict,其中包含有关指定堆栈级别(#)的帧的信息,0将返回最近的堆栈帧 注意:有关信息框架的详细信息,请参阅帖子的结尾。
  5. 在这种情况下,file返回的info frame值已经标准化,因此不需要file normalize <path>

    info scriptinfo frame之间的差异主要用于Tcl包。如果在包需要(info script)期间提供的Tcl文件中使用require package <name>,那么info script将返回当前正在执行的Tcl脚本的路径,并且不会提供实际名称包含info script命令的Tcl文件;但是,此处提供的info frame示例将正确返回包含该命令的文件的文件名。

    如果您想要当前正在评估的脚本的名称,那么:

    set sourcedScript [ info script ]
    

    如果您想要最初调用的脚本(或解释器)的名称,那么:

    set scriptAtInvocation $::argv0
    

    如果您想要最初调用的可执行文件的名称,那么:

    set exeAtInvocation [ info nameofexecutable ]
    

    更新 - 有关详细信息:info frame

    这是堆栈跟踪在Tcl中的样子。 frame_index向我们展示info frame $frame_index0的值[ info frame ]的内容。

    调用info frame [ info frame ]在功能上等同于info frame 0,但使用0当然更快。

    实际上只有1[ info frame ]个堆叠帧,而0的行为类似于[ info frame ]。在此示例中,您可以看到05[ info frame ])是相同的:

    frame_index: 0 | type = source | proc = ::stacktrace | line = 26 | level = 0 | file = /tcltest/stacktrace.tcl | cmd = info frame $frame_counter
    frame_index: 1 | type = source | line = 6 | level = 4 | file = /tcltest/main.tcl | cmd = a
    frame_index: 2 | type = source | proc = ::a | line = 2 | level = 3 | file = /tcltest/a.tcl | cmd = b
    frame_index: 3 | type = source | proc = ::b | line = 2 | level = 2 | file = /tcltest/b.tcl | cmd = c
    frame_index: 4 | type = source | proc = ::c | line = 5 | level = 1 | file = /tcltest/c.tcl | cmd = stacktrace
    frame_index: 5 | type = source | proc = ::stacktrace | line = 26 | level = 0 | file = /tcltest/stacktrace.tcl | cmd = info frame $frame_counter
    

    请参阅: https://github.com/Xilinx/XilinxTclStore/blob/master/tclapp/xilinx/profiler/app.tcl#L273

答案 2 :(得分:7)

您需要$argv0

答案 3 :(得分:4)

您也可以使用[file normalize]来获取完全标准化的名称。

file normalize $argv0
file normalize [info nameofexecutable]

答案 4 :(得分:-2)

我发布问题后

秒...... lindex $argv 0是一个很好的起点; - )