【问题标题】:How to run commands on same TCL shell using Python如何使用 Python 在同一个 TCL shell 上运行命令
【发布时间】:2016-03-03 09:52:47
【问题描述】:

我拥有用 TCL 编写的所有库。我想在 Python 中创建一个 GUI,它有几个按钮和其他选项。在启动时 TCL shell 将打开。当我单击按钮时,将在 TCL shell 上执行相应的命令。

是否可以在不关闭 TCL shell 的情况下在 TCL 的同一个 shell 上触发命令。

我搜索了谷歌并在 Python 中找到了Tkniter 模块,但每次我需要执行命令时它都会打开 TCL shell。

【问题讨论】:

  • 如果您每次要运行命令时都创建一个新的解释器,我觉得您做错了。这是最大限度地增加开销,这很荒谬。
  • @DonalFellows 我读到它是因为他在问如何使用单个 TCL 解释器进程。例如。明确不每次都启动一个新进程。
  • 不,我不想每次都制作新的解释器。我想在同一个旧 TCL shell 上运行命令
  • 我使用os.startfile(cmd) 来做这种事情,例如cmd = 'copy myfile.txt C:\\Users\\Philip\\Desktop'

标签: python tcl


【解决方案1】:

您当然可以使用 Tkinter 在同一个 Tcl 解释器中运行一系列命令:

Python 2.7.9 (default, Feb 28 2016, 05:52:45) [C] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
>>> root = Tkinter.Tk()
>>> root.tk.eval('set msg "hello world"')
'hello world'
>>> root.tk.eval('string length $msg')
'11'
>>> root.tk.eval('foreach x {1 2 4} {puts "$msg $x"}')
hello world 1
hello world 2
hello world 4
''
>>> 

- 这里变量 msg 在一个命令中设置,它的值在后面的命令中使用,如果我们为每个命令创建一个新的解释器,这将不起作用。 如果您不想创建 Tk 窗口,只需运行 root.tk.eval('wm withdraw .') 将其隐藏。

如果这不能回答你的问题,你最好解释一下你还需要什么:-)

【讨论】:

  • 有趣的事实:可以在不创建根窗口的情况下使用 tkinter。 Tk 类采用名为 useTk 的关键字参数。如果您将其设置为False,您将获得一个没有 tk 的 tcl 解释器。
【解决方案2】:

这个问题可以通过Pexpect解决

Pexpect 是一个 Python 模块,用于生成子应用程序和控制 他们自动。 Pexpect 可用于自动化交互式应用程序 例如 ssh、ftp、passwd、telnet 等。它可用于自动设置 用于在不同服务器上复制软件包安装的脚本。它 可用于自动化软件测试。 Pexpect 秉承 Don 的精神 Libes 的 Expect,但 Pexpect 是纯 Python。 Python 的其他类似 Expect 的模块 需要 TCL 和 Expect 或需要编译 C 扩展。 Pexpect 没有 使用 C、Expect 或 TCL 扩展。它应该可以在任何支持的平台上运行 标准的 Python pty 模块。 Pexpect 界面注重易用性,因此 简单的任务很容易。

直接取自 Pexpect 网站的使用示例

child = pexpect.spawn('scp foo myname@host.example.com:.')
child.expect ('Password:')
child.sendline (mypassword)

您可以将终端作为子进程生成,然后在 GUI 生成事件时使用该子进程发送命令。

【讨论】:

  • 提问者说他​​有已经用 Tcl 编写的库,他需要从 Python 调用这些库。 Expect 风格的功能在这里无关紧要。
  • 是的,但我认为这可以通过将单击 Python GUI 上的按钮时生成的事件与期望语句相关联来实现。
  • 如果这里有我遗漏的东西,请补充
【解决方案3】:

我创建了这个简单的 tcl 程序pgm.tcl

puts "Hello world"

我可以在控制台中启动它

tclsh pgm.tcl

这是如何在 python 中启动它

from subprocess import Popen, PIPE
p1 = Popen( ['tclsh', 'pgm.tcl'], stdout=PIPE )
p1out, p1err = p1.communicate()
if p1out is not None: print (p1out)
if p1err is not None: print (p1err)

此答案取决于操作系统 (linux),但您应该能够使其适应其他操作系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多