Fork me on GitHub

【XMLRPC实现跨语言编程】Tcl <----> python

转载请声明出处,谢谢合作。

# 期望一种能实现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。

posted @ 2017-01-09 09:14  流氓兔Nemo  阅读(597)  评论(0编辑  收藏  举报