【发布时间】:2021-12-05 18:51:24
【问题描述】:
在 Python 中有没有办法启动 Tcl shell 或 unix shell 并控制它来执行操作?我了解子进程 TkInter 可用于执行 shell/Tcl 脚本并获取输出。
具体来说,这将是 Tcl 外壳/工具上的一个包装器,它将控制其标准输入/输出。我尝试建立客户端-服务器连接,但为了让 python 控制 tcl shell,需要手动建立连接。这里应该怎么做?
【问题讨论】:
在 Python 中有没有办法启动 Tcl shell 或 unix shell 并控制它来执行操作?我了解子进程 TkInter 可用于执行 shell/Tcl 脚本并获取输出。
具体来说,这将是 Tcl 外壳/工具上的一个包装器,它将控制其标准输入/输出。我尝试建立客户端-服务器连接,但为了让 python 控制 tcl shell,需要手动建立连接。这里应该怎么做?
【问题讨论】:
使用 Tkinter,您可以在与 Python 相同的进程中拥有一个 Tcl 解释器。这对于做传统的东西(或 Tk)来说很好,但如果你有某种自定义的 Tcl 解释器要控制,你可能希望将它作为通过管道连接到父 Python 进程的子进程来启动。
Python 中的 subprocess module 包含您需要的大部分内容。
import subprocess
p = subprocess.Popen(["tclimplementation"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# Turn off buffering on the Tcl side
print("fconfigure stdout -buffering none", file=p.stdin)
# Also should read from p.stdout; here's how
line = p.stdout.readline().strip()
将 Tcl 端告诉fconfigure stdout -buffering none 很重要,因为 Tcl(与大多数进程一样)在写入终端以外的任何东西时默认缓冲多个千字节(对性能很好,对交互使用不太好)。
既然你可以来回发送消息,你需要更多地考虑如何真正控制对方。那是特定于应用程序的。
【讨论】:
tclsh,那么你就可以使用 Tkinter 的内部东西(这肯定更有效)。