转到正文

存档

标签: python

Twisted网络编程必备

XMLRPC: XML-RPC是非常有用的C/S结构的以函数为基础的功能调用服务器。

  1. 允许函数调用中,函数的参数为None:
    请先在服务器端开启allowNone功能: 

    from twisted.web import xmlrpc, server
    
    class Example(xmlrpc.XMLRPC):
    
        def __init__(self):
            xmlrpc.XMLRPC.__init__(self,allowNone=True)
    
        def xmlrpc_echo(self, x):
            """Return all passed args."""
            return x

    然后为客户端开启allow_none功能

    s = xmlrpclib.Server('http://localhost:7081/',allow_none=1)
    print s.echo(None)

    这样就可以用None为参数来调用服务器端的函数了。

  2. 其它

logging模块是Python的日志管理模块,它为Python的高效开发提供了强力的支持。

但是我在使用logging模块时却遇到一个很诡异的错误,我分别以"a"和"a.b"两个字符串调用logging.getLogger函数来获取两个logging对象。例如:

a= logging.getLogger("a")
b= logging.getLogger("a.b")

在执行上面两行代码后,(假设两个日志文件存放在同一文件目录下),对象a的日志输出是正常的,但是对象b出了些问题:每当对象开始进行打日志时,对象a也会被打日志。

出现这个问题,有两个解决方法:

  1. 将对象a所对应的日志文件放在与对象b所对应的日志文件不相同的目录下。
  2. 对象a所对应的日志文件与对象b所对应的日志文件放在相同的目录下,但是调用getLogger时,两个对象不能使用具有相同前缀名的名称。例如,我们可以分别以"a"和"a_b.b"来分别作为两个对象的 getlogger参数,因为它们的前缀分别是"a"和"a_b",二者不相同。

为什么这么来解决,可以看logging模块的源码。

在Linux环境下,默认情况下的python2.3的encode功能不能使用(不能encode gbk2312, utf8)。我们在项目中使用Twisted框架来开发CS结构的程序,服务器端和客户端会用中文消息进行传递。twisted默认使用utf8进行编码【1】,一般情况下,只需要在服务器端用utf8进行编码,客户端则可以自动地将数据解析成功。

但是python2.3在Linux下却无法使用encode utf8功能。因此中文消息无法在CS之间传递。

为了能正确传递中文消息,最后采用的解决方法是:在服务器端用base64编码,然后在客户端用base64解码【2】。这种方法可以正确解决这个问题。

Reference:

1. http://twistedmatrix.com/pipermail/twisted-web/2007-October/003551.html
2. http://blog.csdn.net/lxdcyh/archive/2009/03/24/4021476.aspx

Twisted是一个非常流行的,完全事件驱动的网络框架。

目前我的项目中,急需要一种流行的、稳定的,C/S结构的Python网络编程框架。我的选择有很多:Socket, SocketServer, Twisted, RPyC, XMLRPC…… 。

Socket是非常古老底层的框架,用它来编程有让人回到远古时代的感觉。SocketServer是比较成熟的模块了,但是它不支持RPC远程调用,且也比较古老了。XMLRPC与SocketServer差不多。RPyC看起来挺新的,但是开发者、文档都很少,稳定性不佳。Twisted是一个成熟、开发者众多、文档丰富的强大的网络框架,因此,我将它作为项目的C/S框架。

Twisted最新版本是11.0,它支持Python2.4-2.7. Twisted支持Python2.3的最近版本是9.0【1】. 下面将描述在Linux下安装Twisted9.0+Python2.3 与 在Windows下安装Twisted11.0+Python2.7的方法。

开源的项目在Windows平台下支持都不是很好。对于Python2.3来说,Twisted是没有已经编译好的.exe版本来支持它的(对于Python2.4-2.7,Twisted都有良好的支持的.exe版本)。因此,为了在Windows的Python2.3下使用Twisted来说,只能自己编译源码。然而,编译源码是非常困难的。我建议还是作罢,不要有这种想法。因此,在Windows下,我们是不能用Python2.3来进行Twisted编程的。也正是这个原因,我在Windows下的开发环境是:Python2.7+Twisted11.0。安装Twisted11.0之后,很有可能,你在导入from twisted.internet import protocol, reactor时会报错:

ImportError: No module named zope.interface

解决办法可参考【2】,下载zope.interface 3.6.2即可解决。

继续阅读

作为Linux开发工作者之一,在项目中,我们很有可能会遇到一种情况是:机器Linux自带的软件版本与项目中的软件不一致。大部分情况下,前者比后者新。

因此,我们就需要实现这样的一个目的:将Linux系统自带的软件版本降低。

下面我撰写了两个实例:(机器环境是:Ubuntu10.04,GCC:4.4,Python:3.4)

1.  安装GCC 3.4.6
2.  安装Python 2.3.4

1. 下面描述安装Gcc 3.4.6安装的方法:

首先,下载deb安装包。下载地址是:http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/

先下载gcc-3.4-base_3.4.6-6ubuntu5_i386.deb

然后运行命令 sudo dpkg --force-depends -i gcc-3.4-base_3.4.6-6ubuntu5_i386.deb

然后程序就会出错,但是它会提示我们要下载哪些软件来安装。.

我们按照它的提示下载软件包 cpp-3.4_3.4.6-6ubuntu5_i386.deb和gcc-3.4_3.4.6-6ubuntu5_i386.deb,并再次运行:

sudo dpkg --force-depends -i gcc-3.4-base_3.4.6-6ubuntu5_i386.deb cpp-3.4_3.4.6-6ubuntu5_i386.deb gcc-3.4_3.4.6-6ubuntu5_i386.deb

继续阅读

www.liaoqiqi.com网站PR查询 博客简洁版 博客Google_Site_Map 博客Baidu_Site_Map ?