簡體   English   中英

如何使用 Python 調用 TCL 過程

[英]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.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來完成工作。 它收集輸出並將其返回給調用者。 同樣,出於演示目的,我根本沒有包含任何錯誤檢查。

使用可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM