转载请声明出处,谢谢合作。
# 期望一种能实现tcl、python两者解释器能双向通讯的结合体
# py->tcl: from Tkinter import Tcl; tcl = Tcl(); tcl.eval('')
# tcl->py: 通过xmlrpc机制
具体实现如下
python服务器端:
1 import os 2 import SimpleXMLRPCServer 3 import time, threading 4 from Tkinter import Tcl 5 from selenium import webdriver 6 7 #os.system('taskkill /F /IM python.exe') 8 9 # 切换当前目录至ATOP 10 print os.path.abspath(os.curdir) 11 G_ATOP = '%s%sATOP'%(os.getenv('TCLSPACE'), os.sep) 12 os.chdir(G_ATOP) 13 print os.path.abspath(os.curdir) 14 15 # 创建Tcl解释器(自带默认是tcl8.5)、快捷调用函数 16 # G_Tcl = Tcl() ;# 设置环境变量TCL_LIBRARY=D:/tclSpace/Tcl/lib/tcl8.6 反的 17 # def t(cmd): 18 # return G_Tcl.eval(cmd) 19 20 # 这里会各种找不到package: 注意把需要用到的扩展包都放在TCLLIBPATH中,这样可以共用 21 # 同时编译py下的tcl8.5为tcl8.6 22 # t('source lib/tclcommon.tcl') 23 24 # Start xmlrpcServer 25 # 26 _b = 'global_var' 27 class MyObject: 28 def XMLRPCCMD_py(self,word): 29 global _b 30 #_b = G_ChromeBrowser ;# exec中只能与局部变量交互 31 _ret = '' ;# exec中只能与局部变量交互 32 #pre = '' 33 try: 34 # RER = 1+3 35 exec(u'%s'%word) 36 # % word.decode('GB2312') 37 #G_ChromeBrowser = _b 38 except SyntaxError,e: 39 return "Error-Syntax: ",e 40 except NameError,e: 41 return "Error-Name: ",e 42 _ret=str(_ret) 43 print ' \'%s\'' %_ret 44 return _ret 45 46 _obj = MyObject() 47 _server = SimpleXMLRPCServer.SimpleXMLRPCServer(("127.0.0.1", 23230))#, encoding='utf_8') 48 _server.register_instance(_obj) 49 def run_rpcSrv(): 50 print "rpcServer Listening on port 23230, %s" %threading.current_thread().name 51 _server.serve_forever() 52 53 # 54 # End xmlrpcServer 55 56 57 # 新线程执行的代码: 58 print 'thread %s is running...' % threading.current_thread().name 59 _thread = threading.Thread(target=run_rpcSrv, name='Thread-RpcSrv') 60 _thread.start() 61 #t.join() 62 #print 'thread %s ended.' % threading.current_thread().name 63 64 #t('source v4-MainCli.tcl')
tcl客户端:
1 package require base64 2 package require XMLRPC 3 4 set DEBUG_XMLRPC 1 5 6 source lib/tclcommon.tcl 7 #f_Kills python.exe 8 #set pyId [open "|python lib/dv/py_rpcSrv.py"] 9 after 1000 10 puts "set url http://localhost:23230" 11 12 set url "http://127.0.0.1:23230/RPC2" 13 XMLRPC::create "XMLRPCCMD_py" -proxy $url -params {word string} 14 15 # 默认发命令且获取返回值 带-d时可打印调试信息 -t时仅发命令如[p {print 123} -t] 16 proc p {args} { 17 set ret "" 18 lassign [f_optsAna $args] argLs optLs 19 set cmd [f_str_chinese2u [lindex $argLs 0]] 20 set old_DEBUG_XMLRPC $::DEBUG_XMLRPC 21 set cmdSend "_ret=$cmd" 22 if {"-t" in $optLs} {set cmdSend $cmd} 23 if {"-d" in $optLs} { 24 puts " p {$cmdSend}" 25 set ::DEBUG_XMLRPC 1 26 } 27 if {[catch {set ret [::XMLRPCCMD_py $cmdSend]} ::err]} { 28 set ::DEBUG_XMLRPC $old_DEBUG_XMLRPC 29 error $::err 30 } 31 set ::DEBUG_XMLRPC $old_DEBUG_XMLRPC 32 return $ret 33 } 34 ;
特别注意:
1、WIN 7下若使用本机测试,则写127.0.0.1会比较好,localhost有可能会解析失败而导致连接不成功。
2、tcl的包用teacup安装,python pip。