【发布时间】: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 而不是套接字连接。
但是,我想知道我是否真的做对了,或者您能提出更好的解决方案吗?
提前致谢。
【问题讨论】:
-
quickdraw.pyis a code example where Python function calls are automatically translated into quickdraw commands and piped into the corresponding java process。关键是the rest of the Python code 不需要知道有一个 java 子进程涉及。套接字比管道更强大、更便携(即使在 Windows 上,套接字也可以与select()一起使用),尽管在某些情况下管道可能更简单。 -
pexpect 或许
-
如果您拥有的 Tcl shell 支持偶数循环,您可以简单地使用 Tcllib comm 包将 python
tkinter.Tcl()解释器与 Tcl shell 连接并通过 TCP/IP 发送命令。之后只需将 tkinter 包装器包装在您的 Python 代码中即可完成。 (请参阅core.tcl.tk/tcllib/doc/trunk/embedded/www/tcllib/files/modules/…,如果您愿意,也记录了有线协议)