[英]How to Call TCL Procedure using Python
使用下面的代码,我可以调用 Proc.tcl 文件中的所有过程,但我想单独调用 sum 或 sub 等过程,请告诉我任何其他调用它的可能性
我的 proc 文件程序,
puts "hello"
proc sum {a b} {
set c [expr $a + $b]
puts "Addition: $c "
}
proc sub {a b} {
set c [expr $a - $b]
puts "Substraction: $c "
}
我的主文件程序,
import Tkinter
import os
r=Tkinter.Tk()
r.tk.eval('source proc.tcl')
继续你:
>>> import Tkinter
>>> r = Tkinter.Tk()
>>> r.tk.eval('proc sum {a b} {set c [expr {$a + $b}]; puts "Sum $c"; return $c}')
''
>>> r.tk.eval('sum 2 5')
Sum 7
'7'
所以在您的情况下,在获取tcl文件后,您可以执行r.tk.eval("sum 5 5")
来调用该过程。
注意:始终在tcl中使用expr表达式。 如上面的例子。
我不知道tcl,但这看似合乎逻辑:
import tkinter
r=tkinter.Tk()
r.tk.eval('source proc.tcl')
r.tk.eval('sum 1 2')
r.tk.eval('sub 1 2')
>>> hello
>>> Addition: 3
>>> Substraction: -1
如果你不需要Tkinter的强大功能,你可以稍微重构proc.tcl并通过subprocess
进程调用proc
:
proc sum {a b} {
set c [expr $a + $b]
puts "Addition: $c "
}
proc sub {a b} {
set c [expr $a - $b]
puts "Substraction: $c "
}
eval $argv; # NOTE 1
import subprocess
import shlex
def tcl(command):
command_line = shlex.split(command)
output = subprocess.check_output(command_line)
return output
print tcl('tclsh proc.tcl sum 5 8')
print tcl('tclsh proc.tcl sub 19 8')
增加:13
减产:11
注1:在Tcl脚本中,行eval $argv
采用命令行中的内容并执行它。 它根本不提供错误检查,因此可能存在危险。 在执行命令之前,您需要检查命令行是否存在恶意。 我在这里有什么好的示范目的。
caller.py中的函数tcl
接受命令行,拆分它,并调用proc.tcl来完成工作。 它收集输出并将其返回给调用者。 同样,出于演示目的,我根本没有包含任何错误检查。
使用可以使用r.eval
:
r.eval('source proc.tcl')
r.eval('sub {0} {1}'.format(a, b))
你应该只在proc.tcl
.line中编写函数,就像使用eval
评估时执行puts "hello"
一样。
import subprocess
r = subprocess.check_output('tclsh proc.tcl', shell=True)
在 Caller.py 中尝试:
import tkinter
import os
r = tkinter.Tk()
r.tk.evalfile('proc.tcl')
r.tk.eval('sum 1 2')
r.tk.eval('sub 1 2')
此外,如果您想从 Python 文件中给出数字,请更改如下:
import tkinter
import os
r = tkinter.Tk()
r.tk.evalfile('proc.tcl')
x = 1
y = 2
r.tk.eval('sum {} {}'.format(x,y))
r.tk.eval('sub {} {}'.format(x,y))
而不是r.tk.eval('source proc.tcl')
尝试使用os.system('source proc.tcl')并导入操作系统
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.