如何编辑 .tcl 文件中的一行?

How can I edit a line in .tcl file?

我需要通过命令行 运行 一个 .tcl 文件,它被 Python 脚本调用。但是,该 .tcl 文件中的一行需要根据用户的输入进行更改。例如:

info = input("Prompt for the user: ")

现在我需要 info 中包含的字符串来替换 .tcl 文件中的一行。

重写脚本是比较棘手的选择之一。它使事情更难审计,而且很容易把事情搞砸。除非您采取特殊步骤,否则根本不推荐这样做,例如将您设置的位分解到它自己的文件中:

您编辑的文件,例如,settings.tcl(足够简单,编写起来非常简单,您每次都可以重写整个文件而不会弄得一团糟)

set value "123"

该文件的使用:

set value 0
if {[file readable settings.tcl]} {
    source settings.tcl
}
puts "value is $value"

使用安全的解释器和语言分析可以实现更复杂的版本……但只有当设置和代码位于不同的信任域中时才真正需要它们。


也就是说,还有其他方法通常更容易。如果您通过 运行 子进程调用 Tcl 脚本,传递任意参数的最简单方法是使用以下方法之一:

  1. 命令行参数。这些可以在 Tcl 端从 $argv 全局读取,它在脚本名称后包含所有参数的列表 lindexlassign 命令在这里很有用,例如 set value [lindex $argv 0].)

  2. 一个环境变量。这些可以在 Tcl 端从 env 全局数组读取,例如 set value $env(MyVarName)

  3. 在标准输入上。可以使用 set line [gets stdin].

    从 Tcl 端读取一行

在更复杂的情况下,您可以在它们自己的文件中传递值,或者将它们写入 SQLite 数据库之类的东西,或者……好吧,有很多选择。

如果另一方面,Tcl 解释器在同一个进程中,则在向 运行 请求脚本之前通过在其中设置变量来传递值。 (Tcl 几乎没有真正的全局变量——环境变量是一个特殊的例外,只是因为 OS 将它强加给我们——所以一切都是特定于解释器上下文的。)

具体来说,如果你有一个来自 tkinter 的 Tcl 实例对象(Tk 是它的一个子类),那么你可以这样做:

import tkinter

interp = tkinter.Tcl()
interp.call("set", "value", 123)
interp.eval("source program.tcl")
# Or interp.call("source", "program.tcl")

这样做的好处是可以为您完成所有报价。