Cómo llamar al procedimiento TCL usando Python

Usando el código de abajo, puedo llamar a todos los procedimientos en el archivo Proc.tcl, pero quiero llamar individualmente los procesos como sum o subtenso. Por favor, hágame saber cualquier otra posibilidad de llamarlo.

Mi progtwig de archivo proc,

puts "hello" proc sum {ab} { set c [expr $a + $b] puts "Addition: $c " } proc sub {ab} { set c [expr $a - $b] puts "Substraction: $c " } 

Mi progtwig de archivo principal,

  import Tkinter import os r=Tkinter.Tk() r.tk.eval('source proc.tcl') 

en lugar de r.tk.eval (‘source proc.tcl’)

pruebe con os.system (‘source proc.tcl’) e importe el sistema operativo

Sólo sigue como eres:

 >>> import Tkinter >>> r = Tkinter.Tk() >>> r.tk.eval('proc sum {ab} {set c [expr {$a + $b}]; puts "Sum $c"; return $c}') '' >>> r.tk.eval('sum 2 5') Sum 7 '7' 

Entonces, en su caso, una vez obtenido el archivo tcl puede hacer r.tk.eval("sum 5 5") para llamar a ese procedimiento.

Nota: siempre apoye las expresiones expr en tcl. Como en mi ejemplo anterior.

No sé tcl, pero esto parece lógico:

 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 

Si no necesita el poder de Tkinter, puede reestructurar un poco proc.tcl y llamar al proc través de un subprocess :

proc.tcl:

 proc sum {ab} { set c [expr $a + $b] puts "Addition: $c " } proc sub {ab} { set c [expr $a - $b] puts "Substraction: $c " } eval $argv; # NOTE 1 

caller.py:

 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') 

Salida de caller.py:

Adición: 13

Sustracción: 11

Discusión

  • Nota 1: En el script Tcl, la línea eval $argv toma lo que está en la línea de comando y lo ejecuta. No proporciona ninguna comprobación de errores, por lo que es potencialmente peligroso. Deseará comprobar la línea de comandos para detectar intenciones maliciosas antes de ejecutarla. Lo que tengo aquí es bueno para propósitos de demostración.

  • La función tcl en caller.py toma una línea de comando, la divide y llama a proc.tcl para hacer el trabajo. Recoge la salida y la devuelve al llamante. De nuevo, para fines de demostración, no incluí ninguna comprobación de errores.

El uso puede usar r.eval :

 r.eval('source proc.tcl') r.eval('sub {0} {1}'.format(a, b)) 

Debe escribir solo las funciones en proc.tcl .line como se puts "hello" cuando se evalúe con eval .

 import subprocess r = subprocess.check_output('tclsh proc.tcl', shell=True)