Когда скрипт выполняется напрямую, вы используете:
set theDir [file normalize [file dirname [info script]]]
Этот должен выполняться на верхнем уровне скрипта или внутри namespace eval
(где вы должны использовать variable
вместо set
по техническим причинам). В частности, его не следует помещать в процедуру и вызывать позже, потому что к этому моменту вызов info script
вернет что-то еще. Таким образом, типичный скрипт реализации пакета может выглядеть так:
namespace eval ::samplePackage {
variable theDir [file normalize [file dirname [info script]]]
source $theDir/foo.tcl
source $theDir/bar.tcl
load $theDir/grill[info sharedlibextension]
package provide samplePackage 1.0
}
Если это основное приложение, вы также можете использовать $::argv0
вместо info script
. Это не изменится во время выполнения вашего кода (если вы не установите его вручную).