如何使用Python在相同的TCL shell上运行命令

我有用TCL编写的所有库。 我想在Python中创建一个图形用户界面,它将有几个按钮和其他选项。 在开始的时候TCL shell会打开。 当我点击按钮时,相应的命令将在TCL外壳上执行。

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

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


您当然可以使用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 .')来隐藏它。

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


这个问题可以通过使用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程序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),但你应该能够适应其他操作系统。

链接地址: http://www.djcxy.com/p/32507.html

上一篇: How to run commands on same TCL shell using Python

下一篇: Duration of maximum number of overlapping events