如何在其他tcl脚本中运行tcl脚本?

时间:2012-02-14 10:13:15

标签: tcl

我有两个tcl脚本。我想在第一次完成时运行第二个脚本。我该怎么办?

4 个答案:

答案 0 :(得分:17)

取决于你的意思。

一种方法是编写第三个(“主”)脚本,它将执行

source /the/path/to/the/first.tcl
source /the/path/to/the/second.tcl

另一种方法是将上面示例中的source的第二次调用添加到第一个脚本的底部。

对第一种方法的修改:如果要执行的脚本与主脚本位于同一目录中,那么source它们的惯用方法是

set where [file dirname [info script]]
source [file join $where first.tcl]
source [file join $where second.tcl]

无论当前进程的目录是什么以及项目目录所在的位置,这种方式都可以使用。

答案 1 :(得分:4)

您只需使用source来运行第二个脚本。

source "/tmp/whatever.tcl"

答案 2 :(得分:4)

虽然这通常是一个正确的答案,但由于问题没有得到准确的解决,因此有很多方法可以实现从tcl内运行tcl代码的目标。 我不想详细介绍这一点,因为理解代码的执行是理解tcl itselve的一个主要观点。

有来源

源命令不应该以经典的方式与执行脚本混淆,我认为线程启动器已经问过。

源命令就像" include"命令用c / perl / php。 另一方面,像java或python这样的语言只有" import"机制。

不同之处在于这些语言创建了可用包的内部数据库,这些包链接到相应的源/二进制/字节码文件。通过编写import语句,可以加载链接的源代码或字节码或二进制文件。这允许更深入的依赖管理,而无需编写额外的代码。 在tcl中,这可以通过名称空间和包require命令来实现。 例如:

假设你有这个source.tcl:

proc foo {bar} {puts "baz"}
set BAM "BOO"

现在,你有了#34; master"你称之为脚本。我叫它"主要"。它有内容:

set BAM {my important data}
source source.tcl
#also the function foo can now be used, becouse source reads the whole script
foo {wuz}
set BAM
#will output "BOO"

exec命令

如果你可以忍受启动一个全新的解释器实例的额外开销,你也可以这样做:

set BAM {my important data}
exec tclsh source.tcl
#The variable BAM will not be modified. You can not use the function foo.

eval命令

Eval可以评估一个字符串或一个列表(在tcl中,所有东西都是一个字符串),就像编译代码一样。 您必须将完整的源文件加载到字符串。然后使用eval来评估分隔范围内的代码,而不是覆盖主源文件中的内容。

set fp [open "somefile" r]
set code_string [read $fp]
close $fp
eval $code_string

答案 3 :(得分:0)

我能找到的最简单的工作示例:

thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ tclsh main.tcl 
hello world
7
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat main.tcl 
lappend auto_path /home/thufir/NetBeansProjects/spawnTelnet/telnet/api

package require weather 1.0



tutstack::hello

set A 3
set B 4

puts [tutstack::sum $A $B]


#puts [tutstack::hello "fred"]



thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat api/weather.tcl 
package provide weather  1.0
package require Tcl      8.5

namespace eval ::tutstack {
}

proc ::tutstack::hello {} {
    puts "hello world"
}


proc ::tutstack::sum {arg1 arg2} {
    set x [expr {$arg1 + $arg2}];
    return $x
}

proc ::tutstack::helloWorld {arg1} {
    return "hello plus arg"
}
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat api/pkgIndex.tcl 
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded weather 1.0 [list source [file join $dir weather.tcl]]
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$