﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-开源之路-随笔分类-python</title><link>http://www.cppblog.com/riverbird/category/5866.html</link><description>忆往昔,
项羽不过江.
江东好风光!
今振臂一呼,率甲三千,
试问天!
</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 18:41:17 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 18:41:17 GMT</pubDate><ttl>60</ttl><item><title>python模块之threading: 在python中使用多线程</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39704.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39704.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39704.html</trackback:ping><description><![CDATA[python是支持多线程的，并且是native的线程。主要是通过thread和threading这两个模块来实现的。thread是比较底层的模
块，threading是对thread做了一些包装的，可以更加方便的被使用。这里需要提一下的是python对线程的支持还不够完善，不能利用多
CPU，但是下个版本的python中已经考虑改进这点，让我们拭目以待吧。<br>&nbsp;&nbsp;&nbsp;
threading模块里面主要是对一些线程的操作对象化了，创建了叫Thread的class。一般来说，使用线程有两种模式，一种是创建线程要执行的
函数，把这个函数传递进Thread对象里，让它来执行；另一种是直接从Thread继承，创建一个新的class，把线程执行的代码放到这个新的
class里。我们来看看这两种做法吧。<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #008000;">#</span><span style="color: #008000;">-*-&nbsp;encoding:&nbsp;gb2312&nbsp;-*-</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;string,&nbsp;threading,&nbsp;time<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;thread_main(a):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;获得线程名</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;threadname&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.currentThread().getName()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;int(a)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;取得锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.acquire()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;释放锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.release()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;threadname,&nbsp;x,&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;main(num):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;threads&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建一个锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;mutex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.Lock()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;先创建线程对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;num):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads.append(threading.Thread(target</span><span style="color: #000000;">=</span><span style="color: #000000;">thread_main,&nbsp;args</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #000000;">10</span><span style="color: #000000;">,)))<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;启动所有线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;主线程中等待所有子线程退出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.join()&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建4个线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;main(</span><span style="color: #000000;">4</span><span style="color: #000000;">)</span></div>
</div>
<br>上面的就是第一种做法，这种做法是很常见的，下面是另一种，曾经使用过Java的朋友应该很熟悉这种模式：<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #008000;">#</span><span style="color: #008000;">-*-&nbsp;encoding:&nbsp;gb2312&nbsp;-*-</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;threading<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;time<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test(threading.Thread):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;num):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threading.Thread.</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._run_num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;num<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;run(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadname&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.currentThread().getName()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;int(self._run_num)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.acquire()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.release()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;threadname,&nbsp;x,&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;threads&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;mutex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.Lock()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建线程对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;num):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads.append(Test(</span><span style="color: #000000;">10</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;启动线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;等待子线程结束</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.join()&nbsp; <br></span></div>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 18:04 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IronPython学习 之hello word.</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 01:17:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39646.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39646.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39646.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 09:17 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python 脚本作为Windows服务启动</title><link>http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Tue, 25 Dec 2007 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39582.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39582.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39582.html</trackback:ping><description><![CDATA[如果我们想让系统启动的时候就执行某个程序，windows系统和unix系统是不一样的，对于unix只需要将要执行的命令放到
rc.local中，系统重新启动的时候就可以加载了。windows就麻烦多了，如果你将程序放到启动组中，只有输入了密码后，程序才被执行，如果想在
系统一启动的时候就执行程序，必须使用nt服务。
<br>python下如何使用nt服务，其实很简单。
<br>下载python的win32支持。我使用的是：pywin32-202.win32-py2.3.exe安装好后就可以来写我们的服务了。
<br>我们先来建立一个空的服务，建立test1.py这个文件，并写入如下代码:
<br>
<br>#&nbsp;-*-&nbsp;coding:&nbsp;cp936&nbsp;-*-
<br>import&nbsp;win32serviceutil
<br>import&nbsp;win32service
<br>import&nbsp;win32event
<br>
<br>class&nbsp;test1(win32serviceutil.ServiceFramework):
<br>&nbsp;&nbsp;&nbsp;&nbsp;_svc_name_&nbsp;=&nbsp;"test_python"
<br>&nbsp;&nbsp;&nbsp;&nbsp;_svc_display_name_&nbsp;=&nbsp;"test_python"
<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;args):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win32serviceutil.ServiceFramework.__init__(self,&nbsp;args)
<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.hWaitStop&nbsp;=&nbsp;win32event.CreateEvent(None,&nbsp;0,&nbsp;0,&nbsp;None)
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;SvcStop(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;先告诉SCM停止这个过程
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;设置事件
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win32event.SetEvent(self.hWaitStop)
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;SvcDoRun(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;等待服务被停止
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win32event.WaitForSingleObject(self.hWaitStop,&nbsp;win32event.INFINITE)
<br>
<br>if&nbsp;__name__=='__main__':
<br>&nbsp;&nbsp;&nbsp;&nbsp;win32serviceutil.HandleCommandLine(test1)<br>
<br>这里注意，如果你需要更改文件名，比如将win32serviceutil.HandleCommandLine(test1)中的test1更改为你的文件名，同时class也需要和你的文件名一致，否则会出现服务不能启动的问题。
<br>在命令窗口执行，test1.py可以看到帮助提示
<br>
<br>C:\&gt;test1.py
<br>Usage:&nbsp;'test1.py&nbsp;[options]&nbsp;install|update|remove|start&nbsp;[...]|stop|restart&nbsp;[...]|
<br>debug&nbsp;[...]'
<br>Options&nbsp;for&nbsp;'install'&nbsp;and&nbsp;'update'&nbsp;commands&nbsp;only:
<br>&nbsp;--username&nbsp;domain\username&nbsp;:&nbsp;The&nbsp;Username&nbsp;the&nbsp;service&nbsp;is&nbsp;to&nbsp;run&nbsp;under
<br>&nbsp;--password&nbsp;password&nbsp;:&nbsp;The&nbsp;password&nbsp;for&nbsp;the&nbsp;username
<br>&nbsp;--startup&nbsp;[manual|auto|disabled]&nbsp;:&nbsp;How&nbsp;the&nbsp;service&nbsp;starts,&nbsp;default&nbsp;=&nbsp;manual
<br>&nbsp;--interactive&nbsp;:&nbsp;Allow&nbsp;the&nbsp;service&nbsp;to&nbsp;interact&nbsp;with&nbsp;the&nbsp;desktop.
<br>
<br>C:\&gt;<br>
<br>安装我们的服务
<br>
<br>[code:1:05b7353f1c]C:\&gt;test1.py&nbsp;install
<br>Installing&nbsp;service&nbsp;test_python&nbsp;to&nbsp;Python&nbsp;class&nbsp;C:\test1.test1
<br>Service&nbsp;installed
<br>
<br>C:\&gt;<br>
<br>我们就可以用命令或者在控制面板-》管理工具-》服务中管理我们的服务了。在服务里面可以看到test_python这个服务，虽然这个服务什么都不做，但能启动和停止他。<img src ="http://www.cppblog.com/riverbird/aggbug/39582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-25 15:12 <a href="http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 3.0a2 Release</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 08:55:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39514.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39514.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39514.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 16:55 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open Testware Reviews</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39506.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39506.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39506.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 14:58 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在python代码中进行自动化测试</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39481.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39481.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39481.html</trackback:ping><description><![CDATA[<div class="post-content">
<p>python有一个叫doctest的模块，很有意思，它可以让你在代码的注释中写入一些特殊的注释，<br>
这些注释是测试程序。python可以自动对它进行测试。<br>
import doctest</p>
<p>def myadd(a, b):<br>
&#8221;&#8217;<br>
&gt;&gt;&gt; myadd(1, 2)<br>
3<br>
&gt;&gt;&gt; myadd(4, 5)<br>
9<br>
&#8221;&#8217;<br>
return a+b</p>
<p>if __name__ == &#8216;__main__&#8217;:<br>
doctest.testmod()</p>
<p>输出：</p>
<p>D:\&gt;e2.py -v<br>
Trying:<br>
myadd(1, 2)<br>
Expecting:<br>
3<br>
ok<br>
Trying:<br>
myadd(4, 5)<br>
Expecting:<br>
9<br>
ok<br>
1 items had no tests:<br>
__main__<br>
1 items passed all tests:<br>
2 tests in __main__.myadd<br>
2 tests in 2 items.<br>
2 passed and 0 failed.<br>
Test passed.</p>
<p>注意运行的时候后面加上　-v 的参数，在linux下运行的话，最好这样　python 程序.py -v</p>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 10:44 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发现一个用于windows下GUI自动化测试的东东</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39480.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39480.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39480.html</trackback:ping><description><![CDATA[<div class="post-content">
<p>pywinauto is a set of python modules
to automate the Microsoft Windows GUI. At it&#8217;s simplest it allows you
to send mouse and keyboard actions to windows dialogs and controls.</p>
<p>pywinauto是一些用于自动化测试微软Windows图形界面的模块的集合。它可以允许你很容易的发送鼠标、键盘动作给Windows的对话框和控件。</p>
<p>地址：<a  href="http://www.openqa.org/pywinauto/"><strong><font color="#006699">http://www.openqa.org/pywinauto/</font></strong></a></p>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 10:43 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>