<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/xfszxbb" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/xfszxbb" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 16 Mar 2005 15:06:17 GMT</lastBuildDate><title>limodou的学习记录</title><link>http://blog.sina.com.cn/u/1148608914</link><language>zh-cn</language><copyright>Copyright 1996 - 2009 SINA Inc. All Rights Reserved.</copyright><pubDate>Wed, 08 Jun 2011 19:39:56 GMT</pubDate><item><title>[编程杂谈]在我的Blog上放上我的头像</title><link>http://blog.sina.com.cn/s/blog_4476619201000012.html</link><description>我的一篇Blog上的留言上有人建议我不要放我的大头像在Blog上，因为没人会认识我。而且做开源也不用考虑什么名利。

的确感谢这位网友。要不是他的提醒，我都没注意头像会给一个人什么作用呢。

我的确已经记不起为什么要放一个头像在Blog上了，为了出名，为了让大家认识我，是看到别人也有这样做的，还是觉得版面太空了没什么可放的？也许都有一点点吧，其实这并不重要，因为Blog是个人的东西，放什么都是自已的事。就象 keso 连家里被盗都写了出来，因为他认为这是他的个性的东西，同时可以拉近与阅读者的距离。我认为放头像没什么不好，何况我又不是特别对不起观众。

网络可以方便大家交流，缩短了时空的距离。但我们基本上都是通过文字来交流，只见其文不见其人。有时上到别人的Blog，看到别人的头像，心中想，哦，他 (她)长这样啊。这样原本虚构的形象一下子具体化了，同时会给我一种亲切感。有时会给我感觉，我正在同他面对面交流一样。我不知道别人会不会有这样的感觉，但有时我有。而且仔细想一想，放头像的人绝对不在少数。因此，这种做法也没什么，习惯就好了。

如果大家在大街上能够根据我的头像认出我来，我会非常开心的。不过这种可能性的确不大。:)</description><category>编程杂谈</category><pubDate>Wed, 16 Mar 2005 23:06:17 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_4476619201000012.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_4476619201000012.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_4476619201000012.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396958/1232434</fs:itemid></item><item><title>[Python模块]Gadfly 简单介绍</title><link>http://blog.sina.com.cn/s/blog_4476619201000010.html</link><description>基本上是从 Gadfly 的 FAQ 中看来的。Gadfly 是一个开源的纯 Python 的数据库，支持 ODBC 2.0 的 SQL 标准。

与 [URL=http://www.sqlite.org/]Sqlite[/URL] 相比有些不足：

    * 建表时不能直接设置主键，只能通过创建索引来实现
    * SELECT 语句不支持 LIKE 谓词。说是通过 Python 的正则表达式可以实现，但没看到示例
    * 数据类型还比较少

因为看得比较简单只了解到这么多

但它也有一些优点：

    * 可用于数据恢复的日志，由于程序问题造成数据库当掉，可以进行恢复。(没试过)
    * 支持 Client/Server 模式。
    * 被 [URL=http://www.zope.org/]Zope[/URL] 公司收录其中。

与 Sqlite 相比各有利弊。象性能、支持什么的都没有。目前也好象只有一个人在做。</description><category>Python学习</category><pubDate>Tue, 15 Mar 2005 10:20:57 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_4476619201000010.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_4476619201000010.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_4476619201000010.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396959/1232434</fs:itemid></item><item><title>[Python模块]Karrigell - Python 下的轻型web framework</title><link>http://blog.sina.com.cn/s/blog_447661920100000z.html</link><description>Python 下的web framework真是太多了。这不又看见一个，叫 [URL=http://karrigell.sourceforge.net/]Karrigell[/URL], 同时还了解到它绑定了一个叫 [URL=http://gadfly.sourceforge.net/]Gadfly[/URL] 的数据库。这里有一篇介绍 Karrigell 的文章，大家可以阅读一下了解了解。《[URL=http://www.linuxgazette.com/node/171]Dynamic Web Content with Karrigell[/URL]》

简单了解了一下 Karrigell 已经有的功能：

    * 自带web server
    * 内置的session处理
    * 认证机制
    * 多语言支持
    * 集成了 Gadfly 数据库
    * 自带模板处理功能

测试一下：

下载后解压到一个目录下

执行
[code=c]
    Python Karrigell.py -P 8080
[/code]
执行后，提示我 Gadfly 还没有安装。先不管它。打开浏览器，敲入：
[code=c]
    http://localhost:8080
[/code]
嘿进去了。上面有不少的 Demo 程序。

不过因为没有装 Gadfly 所以许多 Demo 进不去。还是先装一下吧。

我没有使用它自带的 Gadfly 版本，因为有些低。

下载了最新的 Gadfly 开始安装。

    * 将Gadfly解压到一个目录
    * 执行 python setup.py install
    * 然后进入kjbuckets
    * 注意，这里需要编译了。我因为装了 VC 6.0 所以执行 python setup.py install很顺利地编译成功了，并且会自动安装完毕。如果你没有C编译器，那么可以到它的子目录中查找相应的 Python 版本的 kjbuckets.pyd 文件拷贝到 lib/site-packages 目录下即可。不过你也会看到它最高到 2.2，还没有2.3和2.4版本的。不过看 Karrigell 说是支持别的数据库，以后再看吧。不然安装 Gadfly 还有些小麻烦。大家也可以到 [URL=http://www.woodpecker.org.cn/]啄木鸟社区[/URL] 上去下载我编译好的 [URL=http://wiki.woodpecker.org.cn/moin.cgi/limodou?action=AttachFile&lt;/description&gt;
            &lt;author&gt;limodou&lt;/author&gt;
            &lt;category&gt;Python学习&lt;/category&gt;
            &lt;comments&gt;http://blog.sina.com.cn/s/blog_447661920100000z.html#comment&lt;/comments&gt;
            &lt;pubDate&gt;Tue, 15 Mar 2005 10:19:37 +0800&lt;/pubDate&gt;
            &lt;guid&gt;http://blog.sina.com.cn/s/blog_447661920100000z.html&lt;/guid&gt;
        &lt;/item&gt;
        &lt;item&gt;
            &lt;title&gt;[TaskCoach源代码学习]应用类的使用&lt;/title&gt;
            &lt;link&gt;http://blog.sina.com.cn/s/blog_447661920100000y.html&lt;/link&gt;
            &lt;description&gt;&lt;![CDATA[[URL=http://members.chello.nl/f.niessink/]TaskCoach[/URL] 在我以前的 Blog 上我已经介绍过，一直忙，偶尔才有空看一下它的程序。为什么我很想看呢？因为我觉得它的源代码写得非常好，有许多可以学习的地方，特别是在 wxPython 方面，昨天看了一下，竟然还有编程模式的技术在里面，虽然我不是什么模式高手，但了解一下 Python 方面的模式也是很有趣的事。看到哪就写到哪吧。

一般写 wxPython 程序，用户都会从 wx.App 派生一个子类，然后覆盖 OnInit() 方法，一般要返回 True。在 OnInit 中做一些初始化主窗体的工作，许多示例也都是这样的。但 TaskCoach 不是这样的，它派生了一个非常简单的wxApp类，只是简单地覆盖 OnInit() 方法让它返回一个 True而已。真正的工作是生成了App类，由它来进行调度。代码框架是这样的：

[code=c]
    1       class wxApp(wx.App):
    2           def OnInit(self):
    3               return True
    4      
    5       class App(object):
    6           def __init__(self):
    7               self.wxApp = wxApp(0)
    8               self.init()
    9               self.mainwindow.Show()
    10              self.wxApp.MainLoop()
    11     
    12          def init(self, showSplash=True, load=True):
    13              gui.init()
    14              settings = config.Settings(load)
    15              if showSplash and settings.getboolean('window', 'splash'):
    16                  splash = gui.SplashScreen()
    17              self.taskFile = task.TaskFile()
    18              effortList = effort.EffortList(self.taskFile)
    19              self.io = gui.IOController(self, self.taskFile, effortList, settings)
    20              viewFilteredTaskList = task.filter.ViewFilter(self.taskFile)
    21              searchFilteredTaskList = task.filter.SearchFilter(viewFilteredTaskList)
    22              self.mainwindow = gui.MainWindow(self.io, self.taskFile,
    23                  searchFilteredTaskList, effortList, settings)
    24              self.processCommandLineArguments(settings, load)
    25     
    26          def processCommandLineArguments(self, settings, load=True):
    27              # FIXME: move to IOController
    28              if len(sys.argv) &gt; 1:
    29                  filename = sys.argv[1]
    30              else:
    31                  filename = settings.get('file', 'lastfile')
    32              if load and filename:
    33                  self.io.open(filename)
    34     
    35          def displayMessage(self, message):
    36              self.mainwindow.displayMessage(message)
    37     
    38          def quit(self):
    39              self.wxApp.ProcessIdle()
    40              self.wxApp.Exit()
[/code]

第1-3行，派生wxApp类。

第5行，定义自已的App类。这里是从object派生的，因此它使用的是 New Style Class 来处理的。在源代码中我们就会看到大量的使用super()方法来调用父类的使用。

第7行，创建wxApp实例。

第8行，调用自已的初始化处理。从 init() 方法代码可以看到，主要是：

   1. 图形初始化工作
   2. config.Setting用来处理配置文件
   3. 如果需要显示splash窗口(有些软件在启动时可以显示一个启动窗口，TaskCoach就可以。不过它是使用定长时间不是太好。我在 NewEdit 中也加入了这一功能，但使用的是变长时间，即窗口完全启动后自动销毁splash窗口)，则显示splash窗口。
   4. 第19行很有意思，它使用了observation模式(这里不详说了)。
   5. 创建主窗体。
   6. 处理命令行

第9行，初始化完成后，显示主窗体

第10行，进入事件循环

第38-40行，定义退出方法。与一般的程序差别挺大。它主动退出事件循环。

通过封装App类，使得整个处理更有条理。而 [URL=http://wiki.woodpecker.org.cn/moin.cgi/NewEdit]NewEdit[/URL] 在初始化处理这一块就显得有些乱了。有时间也改成这种处理方式。那么它是把配置功能提前在主窗体创建之前，这样很好。而且splash显示得也很早。而 NewEdit 因为是从wx.App派生来的，而且配置文件的读取和splash(才加的)都是放在主窗体中的，这样配置信息在某些时候不是全局可见的。splash窗体的显示也有些晚。这些都是要改进的地方。</description><category>Python学习</category><pubDate>Mon, 14 Mar 2005 13:48:09 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000y.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000y.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000z.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396960/1232434</fs:itemid></item><item><title>[Python Tip]重新设定包的搜索路径，以方便导入子模块</title><link>http://blog.sina.com.cn/s/blog_447661920100000x.html</link><description>也许这个题目有些唬人，不过实在不好表述，这是我在读 TaskCoach 时看到的一段代码。

Q: 我有一个包，已经安装到了 Python 的 lib/site-packages 目录下，我可以通过 import x.sub 方式来导入 x 包的 sub 模块，但我想更方便的使用 import sub 来导入子模块，有没有这样的方法

A: 要做一点简单的工作。
[code=c]

    import x

    libpath = x.__path__[0]
    sys.path.insert(0, libpath)
    del x
[/code]
先导入 x 包，得到它的路径，然后将这个路径加到sys.path(Python的模块搜索路径)的最前面。然后再将 x 模块删除即可。以后再导入 sub 时，可以只使用 import sub 来导入了。

把这段代码加到启动代码中执行，以后就一直生效了。

不过 TaskCoach 中不是使用 insert 来处理的，而是使用 append 来做的，这样我觉得不太好。因此如果在 x 包的前面有与你的子模块同名的模块就麻烦了，还是放在最前面保险。

[B]不过还可以使用 from x import sub 方式来导入，这样更易理解和标准一些[/B]。上述的技术是很有趣将其收录，看情况大家自已使用吧。</description><category>Python Tips</category><pubDate>Sun, 13 Mar 2005 15:04:54 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000x.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000x.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000x.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396961/1232434</fs:itemid></item><item><title>[Python学习]关于插件问题的一个回复</title><link>http://blog.sina.com.cn/s/blog_447661920100000w.html</link><description>这是我在一封邮件中对插件问题的一种回复，当我只是我的理解。其实插件技术本身没有什么特别的规范，只要你可以通过某种机制让别人可以在不改变，或很少改变原来结构的情况下加入一些新的功能，这就可以理解为一种插件技术。有些技术可能比较复杂，因为考虑的情况比较多，有些可能非常简单。因此每种不同的插件技术之间可能在不同的场合有不同的合理的使用，这个要由使用者来选择了。

关于插件我的 NewEdit 几乎就是建立在这个基础之上。但也只是我自已的标准。插件在 Python 中有许多种方式，我就见过好几种。不过也没有见过很详细的插件开发说明。在我的主页和blog上都有关于 NewEdit 所使用的 Mixin 技术的说明，你可以参考。因为 Mixin 方法对 NewEdit 做了一些特殊处理，因此你可能需要自已进行裁剪。那么我简单地说一下我想到的插件技术吧，和我看到的插件使 用方法。

[B]NewEdit 中的 Mixin 技术[/B]。是一种分布类编程的技术，即把一个类的编写由原来一个源文件，转化为多个文件，通过 Mixin 的方法在运行时进行合并生成最终的类。它的主要实现有些复杂，可以查看 NewEdit 的技术手册或我的blog上也有。

    * [url=http://www.donews.net/limodou/archive/2004/10/03/117798.aspx]NewEdit 设计说明(一) -- 概述[/url]
    * [url=http://www.donews.net/limodou/archive/2004/10/03/118184.aspx]NewEdit 设计说明(二) -- Mixin详解[/url]
    * [url=http://www.donews.net/limodou/archive/2004/10/03/118246.aspx]NewEdit 设计说明(三) -- Mixin的处理过程[/url]
    * [url=http://www.donews.net/limodou/archive/2004/10/03/118256.aspx]NewEdit 设计说明(四) -- NewEdit中的具体实现[/url]

[B]最初的Mixin技术[/B]。最初 NewEdit 是从这里借鉴的。主要使用了 __import__(), setattr()。相应的文档参考我的主页上关于 Mixin的文章。http: //pyrecord.freezope.net 但由于使用了 __import__() 因此使用py2exe就有问题了。因此 NewEdit 最终演变为使用 import() 方式，插件必须要显示导入，同时也解决了导入的顺序问题，但方便性差一些。而使用__import__()可以方便地导入整个目录，增加也容易，但顺序无法保存，除非引入其它的机制。

    * [url=http://pyrecord.freezope.org/articles/doc2001042801/show] Mix-in技术介绍[/url]
    * [url=http://pyrecord.freezope.org/articles/doc2001111201/show] Mix-in技术与分布类编程[/url] 

[B]pyblosxom[/B] 通过配置文件设定要导入的模块名，模块名存放在统一的目录下(这个目录也是可以配置的)，然后启动时按模块名和顺序进行导入，使用__import__ () 来导入。方法的调动不是使用setattr()而是在基础模块中预设好的，同时命名有一种规则，如cb_xxx什么的。这样定义简单，但无法扩展新的方法。

pyblosxom中所用的应该说是相对常见的一种插件机制。

那么 NewEdit 的插件方法与pyblosxom的插件方法在导入插件时基本上相同，都需要预设和保持顺序。主要的不同在插件方法的定义上。NewEdit的Mixin的方法是根据需要来定义，而且变量也可以使用这种方法定义，因此不固定，可以自由定义方法的调用点(通过Mixin的覆盖方式，不需要修改原来的处理方法)。而 pyblosxom则 需要定义一种命令规则，方法的调用点不容易修改。

不过插件技术总的来说是会降低软件的执行效率，因此最好考虑延迟装入和显示与处理分离的处理(这方面我还没有想法)，以提高效率。并且在技术成熟的话，一些稳定的插件应该不再做为插件提供，以提高效率。</description><category>Python学习</category><pubDate>Sun, 13 Mar 2005 11:06:42 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000w.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000w.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000w.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396962/1232434</fs:itemid></item><item><title>[NewEdit - Python编辑器]Bug更新，增加模块文件打开功能</title><link>http://blog.sina.com.cn/s/blog_447661920100000v.html</link><description>今天更新了一下 NewEdit 。

发现的Bug是在资源管理器下使用NewEdit报错，以前记得是没有问题的，现在搞不清怎么会有错，可能是不小心给改得有问题了。主要是由于打开文件所在的目录与 NewEdit 所在的目录不同，而 NewEdit 中要使用一些外部的文件，如图片、图标、资源文件、配置文件等，其实已经考虑到在其它目录下打开 NewEdit 的问题，因此对于文件都作为全局变量，在导入模块时就会生成绝对路径，这样在启动 NewEdit  时就可以不在 NewEdit 的安装目录下了。但有些地方可能没有测试到，有些地方的文件没有使用全局变量，因此在改入模块时并不是使用的绝对路径，还是相对路径，因此在打开文件时位置就可能不正确了。路径问题的确是一个大问题，使用绝对路径的方法需要在启动时先要初始化好，这样在运行时再改变当前路径也没有关系。但如果有些文件是无法初始化时就设置好就有问题了。或者是先保存脚本的安装路径，遇到文件名时就考虑是否使用os.path.join()来进行合成(有时可能不需要)。这一样也省不了多大的事，只不过可以不使用全局变量，也不需要在启动前初始化了，但需要传入脚本的安装路径，也有些麻烦。

现在是先记录下当前路径，然后找到 NewEdit 的安装路径，执行 os.chdir() 切换到安装路径，这样在启动时基本上不用考虑路径的问题。但一样要注意在运行中是否会改变路径。对于 NewEdit 的命令行传入的文件名，使用保存的当前路径与文件名进行合并后再进行处理。这样不会把路径搞错。

同时 NewEdit 还增加了：当光标放在一个单词上后，按 F6 或相应的菜单，即可打开单词对应的模块(如果可以打开的话)。这样处理是先执行 __import__(modulname)，然后再查找对应的 .py 文件。因此不是所有情况都有效。</description><category>NewEdit编辑器</category><pubDate>Sat, 12 Mar 2005 22:56:46 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000v.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000v.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000v.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396963/1232434</fs:itemid></item><item><title>[编程杂谈]重装Google桌面搜索</title><link>http://blog.sina.com.cn/s/blog_447661920100000u.html</link><description>以前装过，但删除了，因为觉得除了占地方（因为要建搜引，虽然不知道放在哪里，我也懒得去找），没有太大的用，而且也象别人说的那样，怕有什么隐私给漏了出去。不过，最近又装上了，因此除了它支持许多的文件格式外，的确快速方便。在开始时，它还提示我说因为ThunderBird没有启动，因此不能建立索引，很有意思。最方便的也许是它自已位于任务条上，即可以搜索桌面，也可以搜索网络，的确方便。搜索出的结果按信息的类型进行分类，如邮件，文件， web缓存。而且对 Firefox 支持也很好。这样，我想查个什么文件的话，只要是知道名字，我就几乎不用一个目录一个目录地打开去找了，直接在搜索条上输入关键信息，找到文件后直接打开即可，也省得记文件放在什么地方了。

有些软件只要做得好，真是给人一种震憾啊。</description><category>编程杂谈</category><pubDate>Sat, 12 Mar 2005 11:59:02 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000u.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000u.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000u.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396964/1232434</fs:itemid></item><item><title>[Python学习]使用xmpppy模块来向 Jabber 发送消息</title><link>http://blog.sina.com.cn/s/blog_447661920100000r.html</link><description>只是一个很简单的试验。 xmpppy 是一个 Python 的模块，它可以与 Jabber.org 服务器连接，发送消息。下面是我按照它的项目主页上的一篇基本入门文档做的试验，真是很简单。

从 xmpppy 下载软件后，安装很方便(标准方式)，就是：

    Python setup.py install

它是一个纯 Python 的包。

不过在测试之前你要先到 Jabber.org.org 上找一个 jabber 的客户端，可以使用我介绍过的 Gush 软件。然后申请两个用户，一个自已用，一个测试用，这样方便测试。

然后代码如下(可以在命令行上一条条执行)：

[code＝c]
    #导入 xmpp 模块
    import xmpp
    #创建JID，传入的参数就是你申请的jabber标识，这里是一个示例
    jid=xmpp.protocol.JID('yourname@jabber.org')
    #创建一个客户端
    cl=xmpp.Client(jid.getDomain(),debug=[])
    #与服务器连接
    cl.connect()
    #认证，要输入你的密码
    cl.auth(jid.getNode(),'yourpassword')
    #发送消息，tojid为一个字符串，是目标jabber名字，text也是一个字符
    #串，是你想发送的内容
    cl.send(xmpp.protocol.Message(tojid,text))
[/code]

如果你的 Jabber 客户端是用测试帐号已经打开，你会很快看到收到一条消息。

同时如果将汉字转成utf-8编码，我在 Gush 中的中文测试没有问题。

当然上面只是很简单的功能，但已经可以完成发送信息的功能。真不错。

除了 xmpppy  外还有一个叫 jabber.py 的包，我没有用过，看 xmpppy 介绍是差不多的。不过 xmpppy 的设计与 jabber.py 是不一样的，具体细节有兴趣再看了。

大家有兴趣可以试一试，这样很方便地可以在你的应用中嵌入一些简单的 IM 功能了。</description><category>Python学习</category><pubDate>Fri, 11 Mar 2005 12:14:11 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000r.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000r.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000r.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396965/1232434</fs:itemid></item><item><title>[新闻]Python 2.4.1, release candidate 1发布</title><link>http://blog.sina.com.cn/s/blog_447661920100000q.html</link><description>内容如下：

We are pleased to announce the release of Python 2.4.1, release candidate 1 on March 10, 2005. This is a release candidate of Python 2.4.1 - users are encouraged to download this and test it works for them, but it is not suggested for production usage. A final release of 2.4.1 should follow in around a week's time.

    Note: there's a security fix for SimpleXMLRPCServer.py - this fix is included in 2.4.1

Python 2.4.1 is a bugfix release of Python 2.4 - Python 2.4 is now in bugfix-only mode, no new features are being added. Several dozen bugs were squashed since Python 2.4, including the SimpleXMLRPCServer security fix. See the detailed release notes for more,

没什么特别的，主要就是修正的一些bug和安全问题。</description><category>Python学习</category><pubDate>Thu, 10 Mar 2005 22:58:09 +0800</pubDate><author>limodou</author><comments>http://blog.sina.com.cn/s/blog_447661920100000q.html#comment</comments><guid isPermaLink="false">http://blog.sina.com.cn/s/blog_447661920100000q.html</guid><dc:creator>limodou</dc:creator><fs:srclink>http://blog.sina.com.cn/s/blog_447661920100000q.html</fs:srclink><fs:srcfeed>http://blog.sina.com.cn/myblog/index_rss.php?uid=1148608914</fs:srcfeed><fs:itemid>feedsky/xfszxbb/~1229933/521396966/1232434</fs:itemid></item></channel></rss>
