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

# 期望一种能实现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. FPGA高级设计——时序分析和收敛(转)

    何谓静态时序分析(Static Timing Analysis,简称STA)? 它可以简单的定义为:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分 ...

  2. Windows xp下IDT Hook和GDT的学习

    一.前言   对于IDT第一次的认知是int 2e ,在系统调用的时候原来R3进入R0的方式就是通过int 2e自陷进入内核,然后进入KiSystemService函数,在根据系统服务调用号调用系统服 ...

  3. SQl函数的写法

    USE [ChangHong_612]GO/****** Object: UserDefinedFunction [dbo].[FN_GetProdQty] Script Date: 10/08/20 ...

  4. GitHub托管项目步骤

    1.打开Git Shell ,进入你要托管的项目目录里.然后输入git init ,该项目下就会多一个.git文件夹 2.点击add,然后再path里面输入你项目的,git文件夹目录地址.如下: 3. ...

  5. [C#]匿名类型的深拷贝

    .net Framework 3.5 + C# 3 发布了包括LinQ等一系列功能,其中包括了匿名类型,而我们在升级到.net4后,发现原来写好的用于POCO的深拷贝方法 static object ...

  6. 【转】python中的lambda函数

    http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html lambda函数也叫匿名函数,即,函数没有具 ...

  7. Codeforces Round #329 (Div. 2) B. Anton and Lines 逆序对

    B. Anton and Lines Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/pr ...

  8. 【转】DLX 精确覆盖 重复覆盖

    问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果G[i][j]==1则说明i行可以覆盖j列. Problem: 1)选定最少的行,使得每列有且仅有一个1. 2)选定最少的行,使得每列 ...

  9. fedora 安装lamp

    一.安装apache服务器1.1使用yum进行安装:# yum install httpd1.2配置Apache能够随系统启动而启动#chkconfig --levels 235 httpd on1. ...

  10. PhpCMS标签:专题模块special标签

    专题模块 专题模块PC标签调用说明 模块名:special 模块提供的可用操作 操作名 说明 lists 专题列表 content_list 专题信息列表 hits 专题信息点击排序 下面对所有的操作 ...