我有下面的python代码...
import Tkinter
root = Tkinter.Tk()
root.tk.eval('puts {printed by tcl}')它将“prints by tcl”打印到屏幕上。如何将tcl解释器打印到屏幕上的内容捕获为python字符串。
这是我正在做的事情的一个简化示例。我有一个用python编写的自动化系统,但它是一个由tcl控制的新设备。每个tcl命令都会打印“已连接”或“连接失败”之类的内容,我需要能够将这些内容捕获到python字符串中,这样自动化系统才能知道发生了什么,例如,如果设备没有连接,自动化系统可以重试连接命令。
干杯
来自Nick
发布于 2009-11-18 20:41:26
如果你运行的代码打印到屏幕上,而你用root.tk.eval()调用它,你就不能捕获它。但是,您可以在tcl代码中重新定义“put”做什么,让它做您想做的任何事情。这是Tcl之美的一部分--没有保留字。
只需在tcl解释器中创建一个名为"puts“的进程,但要确保它具有完全相同的接口(即:遵守"-nonewline",可以写入文件等)。当puts通常打印到屏幕上时,你可以让它做任何你想做的事情,比如写到一个套接字,或者只是返回它应该打印的字符串。
粗略地(未经测试,忽略-nonewline的情况):
root.tk.eval('''
rename puts original_puts
proc puts {args} {
if {[llength $args] == 1} {
return "=> [lindex $args 0]"
} else {
eval original_puts $args
}
}
''')
foo = root.tk.eval('puts "hello, world"')
print foo
=> hello, world这将需要一些努力,以确保您不会破坏tcl代码,该代码需要一个标准的“but”语句,但这并不难做到。只需确保有一个参数的特殊情况,即"-nonewline“的第一个参数,以及有两个参数(文件描述符和字符串)的情况。
如果调用eval并执行两个put语句,或者执行一个put语句,然后执行一些其他代码,则可能会变得复杂,因为eval的结果是最后一条语句的结果。但是,您可以通过将其输出缓冲到全局变量,然后在每次执行eval时返回该变量的结果来解决此问题。
因此,稍微跳出框框思考一下,你就可以找到解决方案。Tcl非常灵活。
https://stackoverflow.com/questions/1755415
复制相似问题