【问题标题】:Running TCL code (on an existing TCL shell) from Python从 Python 运行 TCL 代码(在现有的 TCL shell 上)
【发布时间】:2015-09-13 12:48:37
【问题描述】:

简介

我最近开始在 Linux 下开发一个遗留产品,它包含一个内置的 TCL shell。由于公司限制,我无法控制“幕后”,我可以编写的所有代码都必须在这个 TCL shell 下运行,处理产品的预定义笨拙的 TCL API。

我发现自己有几次想知道是否可以将一些 Python 修补到此设置中,因为某些解决方案在 Python 中似乎比在 TCL 中更合法。通过修补 Python,我的意思是:要么从 TCL 代码本身调用 Python 代码(例如,可以使用 Elmer 来完成),要么从产品外部使用 Python 来包装 TCL API(我没有找到“经典”解决方案)。

问题

鉴于产品已经一个现有的 TCL shell在其中,我浏览过的大多数解决方案(例如 Tkinter)都不能用于从 Python 运行 TCL 代码。我需要将代码“注入”到现有的 shell。

考虑的解决方案

作为一种解决方案,我考虑在 TCL 端建立一个简单的服务器,该服务器运行从 Python 端接收的简单命令。我写了一个小演示,它工作。这使我能够在 Python 中为笨拙的 TCL API 编写一个不错的、基于类的包装器,还可以管理命令队列等。

我想到的另外两个解决方案是从 Python 分叉软件并使用读/写文件描述符或通过 FIFO 而不是套接字连接。

但是,我想知道我是否真的做对了,或者您能提出更好的解决方案吗?

提前致谢。

【问题讨论】:

标签: python shell tkinter tcl


【解决方案1】:

首先: 如果你只是想要一个基于类的 OO 系统来编写你的代码,你不需要 python,Tcl 可以做 OO 就好了。 (内置于 8.6,但在旧版本中也有很多选项可以获取 OO 功能、类等,例如 Tcllibs SNITSTOOOP

如果您仍然觉得 Python 是手头任务的最佳工具(例如,由于对某些任务有更好的库支持),您可以使用 Tcllib 通信包“远程控制”Tcl 解释器。这需要您想要控制的 Tcl shell 中的有效事件循环,否则很容易做到。

在您的 Tcl shell 中,安装 Tcllib 通讯包。 (再次询问您是否需要帮助)

一旦你有了它,在你的 Tcl shell 中启动通讯服务器。

package require comm
set id [::comm::comm self]
# write ID to a file
set fd [open idfile.txt w]
puts $fd $id
close $fd
proc stop_server {} {set ::forever 1 }
# enter the event loop
vwait forever

在 python 方面,您几乎可以执行相同的操作,只是在 Tkinter 代码中。

基本上是这样的:

import Tkinter
interp = Tkinter.Tcl()
interp.eval('package require comm')

# load the id
with open('idfile.txt') as fd:
    comm_id = fd.read().strip()

result = interp.eval(
    'comm::comm send {0!s} {1!s}'.format(comm_id, '{puts "Hello World"}')

使用该 python 代码和您的 shell,您应该会看到 Hello World 打印在您的 shell 中。

阅读通讯手册了解更多细节,如何保护事物,获取回调等。comm

如果你不喜欢 tkinter 的负担,你也可以为 comm 实现有线协议,在 Twisted 或 Python 3.x 中新的异步支持应该不会太难。 在线协议记录在: comm wire protocol

【讨论】:

  • 谢谢!第一行 (set srv [::comm:comm]) 中没有错误,因为 ::comm::comm 需要一个参数,而您并没有真正使用 srv,还是我遗漏了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多