【问题标题】:How to Call TCL Procedure using Python如何使用 Python 调用 TCL 过程
【发布时间】:2013-05-02 15:21:21
【问题描述】:

使用下面的代码我可以调用 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')

【问题讨论】:

    标签: python tkinter tcl


    【解决方案1】:

    照原样继续:

    >>> 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 表达式。就像我上面的例子一样。

    【讨论】:

      【解决方案2】:

      我不知道 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,大写T。
      • 这实际上取决于python版本(python 3中的tkinter)
      【解决方案3】:

      如果你不需要Tkinter的强大功能,你可以稍微重构一下proc.tcl,然后通过subprocess调用proc

      proc.tcl:

      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
      

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

      caller.py 的输出:

      加法:13

      减法:11

      讨论

      • 注意 1:在 Tcl 脚本中,eval $argv 行获取命令行中的内容并执行它。它根本不提供错误检查,因此可能很危险。在执行命令行之前,您需要检查命令行是否存在恶意。我这里的东西很适合演示。

      • caller.py 中的函数tcl 采用命令行,将其拆分,然后调用 proc.tcl 来完成工作。它收集输出并将其返回给调用者。同样,出于演示目的,我根本没有包含任何错误检查。

      【讨论】:

      • 请注意,这有一个额外的过程的缺点,客户端间通信的开销等。你应该只在需要时回退到这样的事情(不安全的代码执行等)
      • 这太完美了...我正在尝试演示 tcl 和 python 之间的互操作性,这让我无需在我们的网格机器上安装 Tkinter 就可以做到!
      【解决方案4】:

      使用可以使用r.eval

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

      您应该只在proc.tcl.line 中编写函数,例如puts "hello" 将在使用eval 评估时执行。

      【讨论】:

        【解决方案5】:
        import subprocess
        
        r = subprocess.check_output('tclsh proc.tcl', shell=True)
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          而不是 r.tk.eval('source proc.tcl')

          尝试使用 os.system ('source proc.tcl') 并导入操作系统

          【讨论】:

          • 坦率地说,我不明白这怎么可能奏效。你能详细说明为什么会这样吗?
          • @abhi:是的,你能详细说明一下吗?我知道 tcl 解释器嵌入在 python 中。 .tcl 扩展名提示 system() 使用该解释器?我有什么意义吗...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-06
          • 1970-01-01
          • 1970-01-01
          • 2018-04-10
          • 1970-01-01
          相关资源
          最近更新 更多