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

7cwmlq89  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(668)

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

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

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

gv8xihay

gv8xihay1#

重写脚本是一个比较棘手的选择。它使事情更难审计,而且极易造成混乱。除非您采取特殊步骤,例如将设置的位分解到其自己的文件中,否则根本不建议使用:
您编辑的文件,例如。, settings.tcl (非常简单,编写起来非常简单,每次都可以重写全部内容而不会弄糟)

set value "123"

使用该文件:

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

使用安全的解释器和语言分析可以实现更复杂的版本,但只有当设置和代码位于不同的信任域时,才真正需要它们。
也就是说,还有其他方法通常更容易。如果通过运行子流程调用tcl脚本,传递任意参数的最简单方法是使用以下方法之一:
命令行参数。可以在tcl侧从 $argv global,它在脚本名称后保存所有参数的列表(这个 lindexlassign 命令在这里很有用,例如。, set value [lindex $argv 0] .)
环境变量。可以在tcl侧从 env 全局数组,例如。, set value $env(MyVarName) 关于标准输入。可以使用 set line [gets stdin] .
在更复杂的情况下,您可以将值传递到它们自己的文件中,或者通过将它们写入sqlite数据库之类的东西,或者……嗯,有很多选项。
另一方面,如果tcl解释器处于相同的过程中,则在请求运行脚本之前,通过设置其中的变量来传递值(tcl几乎没有真正的全局变量—环境变量是一个特殊的例外,这只是因为操作系统强制我们使用它—所以所有内容都是特定于解释器上下文的。)
具体来说,如果您从tkinter获得了一个tcl示例对象(tk是该对象的子类),那么您可以执行以下操作:

import tkinter

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

# Or interp.call("source", "program.tcl")

这样做的好处是为你做所有的报价。

相关问题