如何编辑 .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 脚本,传递任意参数的最简单方法是使用以下方法之一:
命令行参数。这些可以在 Tcl 端从 $argv
全局读取,它在脚本名称后包含所有参数的列表 。(lindex
和 lassign
命令在这里很有用,例如 set value [lindex $argv 0]
.)
一个环境变量。这些可以在 Tcl 端从 env
全局数组读取,例如 set value $env(MyVarName)
在标准输入上。可以使用 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")
这样做的好处是可以为您完成所有报价。
我需要通过命令行 运行 一个 .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 脚本,传递任意参数的最简单方法是使用以下方法之一:
命令行参数。这些可以在 Tcl 端从
$argv
全局读取,它在脚本名称后包含所有参数的列表 。(lindex
和lassign
命令在这里很有用,例如set value [lindex $argv 0]
.)一个环境变量。这些可以在 Tcl 端从
env
全局数组读取,例如set value $env(MyVarName)
在标准输入上。可以使用
从 Tcl 端读取一行set line [gets stdin]
.
在更复杂的情况下,您可以在它们自己的文件中传递值,或者将它们写入 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")
这样做的好处是可以为您完成所有报价。