Получение пути процедуры в TCL, которая вызывается из другого скрипта

я новичок в программировании TCL

У меня есть tcl-скрипт с именем test1.tcl и test2.tcl отдельно в двух разных

каталоги F:\TCLPrograms\SamplePrograms\test1.tcl и F:\TCLPrograms\test2.tcl

я хочу знать полный путь к test2.tcl, который является процедурой

если я даю информацию [скрипт] внутри proc disp {}, он возвращает путь, откуда он вызывается

то есть F:\TCLPrograms\SamplePrograms\test1.tcl

пожалуйста, кто-нибудь скажите мне, чтобы получить путь к процедуре

test1.tcl:

puts "Processing test1..."
source "F:\\TCLPrograms\\test2.tcl"
set rc [disp]
puts "Executed...."

test2.tcl:

proc disp { } {
puts "Successfully executed test2.tcl"
set path [info script]
puts "Script is invoked from the path: $path"
}

заранее спасибо


tcl
person Vivek    schedule 04.03.2011    source источник


Ответы (1)


Результат info script зависит от текущего самого внутреннего source, и процедуры не поддерживают эту информацию. (Ну, он поддерживается в отладочной информации для 8.6 и некоторых сборок 8.5 из ActiveState, но доступ к нему действительно неудобен.)

Самый простой способ — использовать переменную для хранения имени файла, например:

variable dispScriptFile [file normalize [info script]]
proc disp {} {
    variable dispScriptFile
    puts "Successfully executed test2.tcl"
    set path [file dirname $dispScriptFile]
    puts "Script is invoked from the path: $path"
}

Обратите внимание, что мы используем нормализованное имя файла, так что оно остается действительным, даже если вы используете относительный путь, а затем cd в какой-либо другой каталог. (Я также рекомендую поместить все содержимое test2.tcl в его собственное пространство имен; это упрощает разделение вещей.)

person Donal Fellows    schedule 04.03.2011
comment
Спасибо за ценный комментарий - person Vivek; 04.03.2011
comment
но проблема в том, что у меня есть еще два proc {} в одном и том же test2.tcl, которые я буду вызывать из двух разных сценариев tcl, которые находятся в другом месте всякий раз, когда я вызываю proc {}, мне нужно знать путь, который вы можете предложить для него ? - person Vivek; 04.03.2011
comment
Вы можете совместно использовать одну переменную между всеми процедурами, определенными в этом файле (при необходимости измените имя). Либо так, либо я совершенно неправильно понимаю ваш вопрос. - person Donal Fellows; 05.03.2011
comment
Мне особенно нравится часть нормализации файла. Отличная идея. - person Hai Vu; 06.03.2011