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

# 期望一种能实现tcl、python两者解释器能双向通讯的结合体
# py->tcl: from Tkinter import Tcl; tcl = Tcl(); tcl.eval('')
# tcl->py: 通过xmlrpc机制

具体实现如下

python服务器端:

 import os
import SimpleXMLRPCServer
import time, threading
from Tkinter import Tcl
from selenium import webdriver #os.system('taskkill /F /IM python.exe') # 切换当前目录至ATOP
print os.path.abspath(os.curdir)
G_ATOP = '%s%sATOP'%(os.getenv('TCLSPACE'), os.sep)
os.chdir(G_ATOP)
print os.path.abspath(os.curdir) # 创建Tcl解释器(自带默认是tcl8.5)、快捷调用函数
# G_Tcl = Tcl() ;# 设置环境变量TCL_LIBRARY=D:/tclSpace/Tcl/lib/tcl8.6 反的
# def t(cmd):
# return G_Tcl.eval(cmd) # 这里会各种找不到package: 注意把需要用到的扩展包都放在TCLLIBPATH中,这样可以共用
# 同时编译py下的tcl8.5为tcl8.6
# t('source lib/tclcommon.tcl') # Start xmlrpcServer
#
_b = 'global_var'
class MyObject:
def XMLRPCCMD_py(self,word):
global _b
#_b = G_ChromeBrowser ;# exec中只能与局部变量交互
_ret = '' ;# exec中只能与局部变量交互
#pre = ''
try:
# RER = 1+3
exec(u'%s'%word)
# % word.decode('GB2312')
#G_ChromeBrowser = _b
except SyntaxError,e:
return "Error-Syntax: ",e
except NameError,e:
return "Error-Name: ",e
_ret=str(_ret)
print ' \'%s\'' %_ret
return _ret _obj = MyObject()
_server = SimpleXMLRPCServer.SimpleXMLRPCServer(("127.0.0.1", 23230))#, encoding='utf_8')
_server.register_instance(_obj)
def run_rpcSrv():
print "rpcServer Listening on port 23230, %s" %threading.current_thread().name
_server.serve_forever() #
# End xmlrpcServer # 新线程执行的代码:
print 'thread %s is running...' % threading.current_thread().name
_thread = threading.Thread(target=run_rpcSrv, name='Thread-RpcSrv')
_thread.start()
#t.join()
#print 'thread %s ended.' % threading.current_thread().name #t('source v4-MainCli.tcl')

tcl客户端:

 package require base64
package require XMLRPC set DEBUG_XMLRPC 1 source lib/tclcommon.tcl
#f_Kills python.exe
#set pyId [open "|python lib/dv/py_rpcSrv.py"]
after 1000
puts "set url http://localhost:23230" set url "http://127.0.0.1:23230/RPC2"
XMLRPC::create "XMLRPCCMD_py" -proxy $url -params {word string} # 默认发命令且获取返回值 带-d时可打印调试信息 -t时仅发命令如[p {print 123} -t]
proc p {args} {
set ret ""
lassign [f_optsAna $args] argLs optLs
set cmd [f_str_chinese2u [lindex $argLs 0]]
set old_DEBUG_XMLRPC $::DEBUG_XMLRPC
set cmdSend "_ret=$cmd"
if {"-t" in $optLs} {set cmdSend $cmd}
if {"-d" in $optLs} {
puts " p {$cmdSend}"
set ::DEBUG_XMLRPC 1
}
if {[catch {set ret [::XMLRPCCMD_py $cmdSend]} ::err]} {
set ::DEBUG_XMLRPC $old_DEBUG_XMLRPC
error $::err
}
set ::DEBUG_XMLRPC $old_DEBUG_XMLRPC
return $ret
}
;

特别注意:

1、WIN 7下若使用本机测试,则写127.0.0.1会比较好,localhost有可能会解析失败而导致连接不成功。

2、tcl的包用teacup安装,python pip。

【XMLRPC实现跨语言编程】Tcl <----> python的更多相关文章

  1. 跨语言学习的基本思路及python的基础学习

    笔者是C#出身,大学四年主修C#,工作三年也是C#语言开发.但在学校里其他的语言也有相应的课程,eg:Java,Php,C++都学过,当然只是学了皮毛(大学嘛,你懂得),严格来说未必入门,但这些语言的 ...

  2. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  3. 9 本免费的 Python 语言编程书籍(转载)

    9 本免费的 Python 语言编程书籍 原文地址:http://linuxtoy.org/archives/9-free-python-books.html 2010-03-03 Toy Poste ...

  4. 转:Python语言编程学习资料(电子书+视频教程)下载汇总

    开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingware WingIDE Professio ...

  5. Apache Thrift 跨语言服务开发框架

    Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...

  6. Apache Thrift - 可伸缩的跨语言服务开发框架

    To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...

  7. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

  8. thrift框架总结,可伸缩的跨语言服务开发框架

    thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...

  9. 【转】Apache Thrift - 可伸缩的跨语言服务开发框架

    Apache Thrift - 可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详 ...

随机推荐

  1. UVA 315 315 - Network(求割点个数)

     Network  A Telephone Line Company (TLC) is establishing a new telephone cable network. They are con ...

  2. SPOJ 375 (树链剖分 - 边权剖分 - 修改单边权)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#problem/I 给你一棵有边权的树,有两个操作:一个操作是输出l到 ...

  3. UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)

    题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...

  4. thinkPHP模板的输出和模型的使用

    a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休要修改配置文件中的配置项 'TMPL_L_DELIM' ...

  5. 令人惊奇的gdb和pstack

    pstack竟然是一个shell脚本,核心是调用gdb的thread apply all bt查看进程的所有线程的堆栈,之后用sed正则展示线程堆栈信息. /proc/pid/exe是一个指向可执行文 ...

  6. 【搬运】【备份】imrc文件

    存档. " ============================================================================= " < ...

  7. android常见错误-E/AndroidRuntime(13678): java.lang.NoClassDefFoundError:

    08-01 11:09:39.791: E/AndroidRuntime(13678): FATAL EXCEPTION: main 08-01 11:09:39.791: E/AndroidRunt ...

  8. Codeforces Testing Round #12 C. Subsequences 树状数组维护DP

    C. Subsequences Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/597/probl ...

  9. Cache选型的一些思考

    Cache对于减轻DB负载有非常关键的数据.以下对经常使用的memcached和redis做个总结,便于技术选型. 1 memcached  (1) 支持的操作有限,支持经常使用的set,get,de ...

  10. Apache Solr采用Java开发、基于Lucene的全文搜索服务器

    http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...