【问题标题】:Python controlling Tcl shellPython 控制 Tcl shell
【发布时间】:2021-12-05 18:51:24
【问题描述】:

在 Python 中有没有办法启动 Tcl shell 或 unix shell 并控制它来执行操作?我了解子进程 TkInter 可用于执行 shell/Tcl 脚本并获取输出。

具体来说,这将是 Tcl 外壳/工具上的一个包装器,它将控制其标准输入/输出。我尝试建立客户端-服务器连接,但为了让 python 控制 tcl shell,需要手动建立连接。这里应该怎么做?

【问题讨论】:

    标签: python shell unix tcl


    【解决方案1】:

    使用 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(与大多数进程一样)在写入终端以外的任何东西时默认缓冲多个千字节(对性能很好,对交互使用不太好)。

    既然你可以来回发送消息,你需要更多地考虑如何真正控制对方。那是特定于应用程序的。

    【讨论】:

    • 一个关键点是来回发送消息的长度;多行消息比您可以保证它们是单行消息需要更多的工作。
    • 嗯。如果您可以在创建新的 tcl interp 或线程时提供用于 stdin/stdout/stderr 的通道,那就太好了。
    • 感谢@DonalFellows。你能解释一下“tclimplementation”是什么意思吗?那是 tcl bin 路径的占位符吗?
    • @almostacoder 正是这样。如果它是标准的tclsh,那么你就可以使用 Tkinter 的内部东西(这肯定更有效)。
    • 好吧,只是添加默认流是字节,所以打印语句字符串需要先转换为字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多