【问题标题】:How can I edit a line in .tcl file?如何编辑 .tcl 文件中的一行?
【发布时间】:2021-09-20 04:14:50
【问题描述】:

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

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

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

【问题讨论】:

  • 用用户输入重写脚本听起来真是个坏主意。相反,找到一种方法为您的 tcl 脚本传递这个参数
  • 在调用 tcl 脚本时最好将其作为命令参数传递。或者也许设置一个环境变量。正如@mvp 所说,重写代码几乎从来都不是办法。
  • 请记住,替换文本文件中的单行实际上需要读取整个文本文件并用文本更改重写它。 (除非它恰好与您要替换的字符数完全相同,但请不要去那里......)
  • 你做了什么尝试?与您的想象相反,Stackoverflow 不是免费的定制软件设计和编码服务。
  • 谢谢大家的建议和警告。我很感激!

标签: python python-3.x command-line terminal tcl


【解决方案1】:

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

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

set value "123"

使用该文件:

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

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


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

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

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

  3. 在标准输入上。可以使用 set line [gets stdin] 从 Tcl 端读取一行。

在更复杂的情况下,您可以在它们自己的文件中传递值,或者将它们写入 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")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    相关资源
    最近更新 更多