像python函数一样直接使用tcl库

1 问题由来

很多企业之前自动化脚本都是tcl的,但是目前随着Robot Framework和python的流行,纷纷由tcl转向python,但是遗留的大量的tcl库没法使用,如果重新开发需要大量的人力和物力,如何才能让现存的大量tcl库能够在python里面直接使用呢?
本文介绍一种非常简单的方式,供大家参考。

2 解决方案

本方案基于以下的python语言工具:
●Python自带了tcl解释器
●Python对象模型中的__getattr__钩子函数
●functools中的partial函数
python是一门充满钩子的语言,当对象通过点操作符号(.)调用成员方法的时候,如果找不到该方法,就会调用__getattr__这个方法来查找。我们的方案的核心思想就是基于这一点。我们先定义一个类,重载这个类的__getattr__,在这个方法中返回一个执行对应tcl方法的函数。这样,我们就可以通过创建这个类的对象来访问响应的tcl方法。比如说创建了对象tclobj,想调用tcl方法expr,那就这样访问就可以了:tclobj.expr(“8 * 8”)。
其中的逻辑是这样的:tclobj调用expr的时候,在mro的列表里面找不到expr这个方法名字,就会调用__getattr__,在重载的这个函数里面,我们直接去tcl解释器里面查找这个函数,并返回一个经过自动封装的python函数。
在返回自动封装的python函数之前,用了functools中的partial函数对函数进行了封装,形成临时函数,再将这个函数返回。

3 实现代码

本例基于以下的假设来实现:
●tcl库文件就在python代码的文件夹下面或者在mytcllib.tcl文件里面
●python解释器版本支持f-string

from tkinter import Tcl
from functools import partial
import os
import sys

class tclrunner:

    def __init__(self) -> None:
        self.tclinterpreter = Tcl()
        filepath = os.path.dirname( os.path.abspath(__file__) )
        libfile = os.path.join(filepath, "mytcllib.tcl")
        self.tclinterpreter.eval( f"lappend auto_path {{{filepath}}}" )
        self.tclinterpreter.eval( f"source {{{libfile}}}" )

    def runtcl(self, tclcode):
        return self.tclinterpreter.eval( tclcode )

    def __getattr__(self, tclcmd):

        def tclfunction(cmd, *args):
            script = cmd
            for param in args:
                param = str( param )
                script += f" {{{param}}}"
            print(f"tcl expresion is: {script}")
            return self.runtcl( script )
        
        return partial( tclfunction, tclcmd )

mytclobj = tclrunner()
res = mytclobj.add( 8, 8 )
print(res)
res = mytclobj.expr( "8 * 8" )
print(res)

mytcllib.tcl的内容:

puts "in tcl lib file"

proc add {a b} {
    return [expr $a + $b]
}

puts [add 1 2]

python代码的10-13行是设置库函数的文件夹到tcl的auto_path里面,并把mytcllib.tcl里面的内容导入tcl。
python代码的18-28行是关键。在这里定义了tclfunction函数函数,经过partial封装,返回临时函数。
python代码31行,像调用python函数一样调用tcl中的自定义函数add,add是在tcl文件里面定义的。
python代码33行,像调用python函数一样调用tcl中的内置函数expr。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Tcl语言中,concat函数用于将多个字符串连接成一个字符串。在给定的引用\[1\]中,concat函数被用来将变量$x、$y和$z的值连接起来,并将结果赋给变量$m。最后,使用puts命令将变量$x、$y、$z和$m的值打印出来。 Tcl语言的全称是Tool Command Language,即工具命令语言。它是一种在EDA工具中广泛使用语言,几乎每个EDA工具都支持Tcl语言。对于IC专业的人来说,学习Tcl语言是非常重要和必要的。在IC设计中,静态时序分析经常使用Synopsys Tcl语言,而其他FPGA厂商如Xilinx的.ucf文件和.xdc文件也是用Tcl语言编写的,与Synopsys的Tcl语言基本相同。在FPGA设计中,时序约束和静态时序分析经常使用Tcl语言。因此,学习Tcl语言为后续的时序约束和静态时序分析打下了基础。引用\[2\] Tcl语言的起源与发展可以追溯到1988年,由John K. Ousterhout在加州大学伯克利分校(UCB)开始开发Tcl是为了可扩展性、学习曲线短和易于嵌入而设计的。Tk的开发始于1989年,第一个版本于1991年发布。引用\[3\] 总的来说,Tcl语言简单易懂,功能强大,常用于快速原型开发、GUI、脚本和测试。尽管Python的流行,但Tcl语言仍然在一些领域得到广泛应用。引用\[3\] #### 引用[.reference_title] - *1* *2* *3* [(80)TCL脚本命令【运算符(concat合并语法)】](https://blog.csdn.net/m0_46498597/article/details/128361738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值