<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:ppp="http://blog.sohu.com/rss/module/ppp/"
	>

	<channel>
		<title>acloud的blog</title>
		<link>http://acloudblog.blog.sohu.com/</link>
		<description><![CDATA[C++方面的老家伙了]]></description>
		<pubDate>Thu, 28 Aug 2008 12:56:42 +0800</pubDate>
		<generator>搜狐博客</generator>
		<ppp:ebi>9d51c74792</ppp:ebi>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>软件需求和软件功能的区别</title>
			<link>http://acloudblog.blog.sohu.com/98449169.html</link>
			<comments>http://acloudblog.blog.sohu.com/98449169.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Thu, 28 Aug 2008 12:56:42 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/98449169.html</guid>
			<description><![CDATA[<div style="text-align: center;"><font size="5">软件需求和软件功能的区别</font><br /></div><div style="text-align: center;"><font size="3"><span style="font-family: 黑体;">黄国强 2008-8-28</span></font><br /></div><br />&nbsp;&nbsp; 很多人对软件需求和软件功能之间的区别模糊不清。在软件需求收集阶段，开发者不知道自己究竟应该写什么，形成的文档往往是罗列了很多软件功能，最后形成固定的思维定式，认为做需求就是收集软件的功能。<br />&nbsp;&nbsp;&nbsp; 我对此问题有如下结论：<br />&nbsp;&nbsp;&nbsp; <span style="color: rgb(255, 0, 0);">软件需求关注的是做什么的问题，而软件功能关注的是怎么做的问题。软件需求是为用户服务的，而软件功能是为软件开发服务的。相对于软件需求这个目的，软件功能是手段。</span><br />&nbsp;&nbsp;&nbsp; 列举软件功能是软件开发第二阶段&mdash;规格定义所做的工作。显然，在软件需求收集阶段，列出软件功能是不对的。<br />&nbsp;&nbsp;&nbsp; 举一个简单的例子，我很渴，需要喝水。这是我的目的。最后究竟是喝茶、喝可乐还是纯净水。这个就是手段。<br />&nbsp;&nbsp;&nbsp; 以上例子中，我这样写我的文档。<br />&nbsp;&nbsp;&nbsp; 第一阶段&mdash;需求收集阶段，我在需求文档中写下了这样一句话&ldquo;我需要喝水&rdquo;。<br />&nbsp;&nbsp;&nbsp; 第二阶段&mdash;规格定义阶段，我在规格定义文档中写下了这样一句话&ldquo;我可以通过喝可乐来满足我的需求。&rdquo;<br /><br />]]></description>
		</item>
		    
		
		<item>
			<title>被员工认同的文化才有价值(转)</title>
			<link>http://acloudblog.blog.sohu.com/97302092.html</link>
			<comments>http://acloudblog.blog.sohu.com/97302092.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Fri, 15 Aug 2008 12:27:43 +0800</pubDate>
			<category>资料备忘</category>
			<guid>http://acloudblog.blog.sohu.com/97302092.html</guid>
			<description><![CDATA[<table border="0" cellpadding="0" cellspacing="0"><tbody><tr style="font-weight: bold;"><td align="center" height="30"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td align="center" height="30"><font size="5">被员工认同的文化才有价值</font></td></tr> </tbody></table>
 </td>
 </tr>
 
 
 
 <tr> 
 <td align="center" height="30"> 
 <table border="0" cellpadding="0" cellspacing="0"> <tbody><tr><td align="center" height="30">&nbsp;&nbsp;&nbsp;&nbsp;2008-08-15&nbsp;&nbsp;&nbsp;&nbsp;徐殿龙&nbsp;&nbsp;&nbsp;&nbsp;来源:经济参考报</td></tr> </tbody></table>
 </td>
 </tr>
 <tr> 
 <td align="center" height="8"><br /></td>
 </tr>
 <tr> 
 <td align="center"> 
 <table border="0" cellpadding="0" cellspacing="0"> <tbody><tr><td><!--enpcontent-->　　目前，一些企业的所谓企业文化建设，仅仅是写在纸上，挂在墙上，就是没有深入到员工的思想深处，没有被员工认同。<br />　
　这是一些企业在企业文化建设上司空见惯的做法：一种是花大钱找所谓的专家给企业设计一本又一本或企业标识，或企业文化建设纲要等，钱没少花，事也没少
做，可结果呢，贯彻到基层的廖廖无几，能让员工记住的少之又少，更不知道所以然。更可笑的是有些企业的老总自己都没有好好看过他们做的东西，最后束之高
阁，藏于密室，成为了企业供人欣赏的作秀之物。<br />　　一种是把企业文化过于简单化，以为形成几句时髦口号、制作几个标识、旗帜，甚至写个厂歌等就是
企业文化了，而这些放之四海皆准的口号根本就和企业的实际脱节，不仅没有特色，更没有和管理相融合。形神不统一，有外型没内涵，无法成为职工的自觉行动。
这些都暴露了在企业文化及其建设方面存在的肤浅、片面、不求甚解和附庸风雅。<br />　　企业文化建设的核心是员工认同，要让员工清楚地知道为什么这是我
们的文化、我们的文化如何解释、我究竟如何做才能符合企业属性？企业文化的作用不仅仅是对内有凝聚作用，更重要的作用在于提升团队的绩效和能力，提高经营
业绩，铸造品牌信仰，使企业基业长青。企业文化不是讲一堂好的课程、写本厚厚的理论书籍或者创意几个理念词语就成了的，一个企业的文化真正成功的标志就在
于，企业的价值观及其相关理念被员工认知、认同、认可后变成企业职工的自觉行动，体现在生产、管理以及经营的全过程。一定意义上讲，没有员工认同的文化不
成其为企业文化，就没有价值。在市场竞争中也会显得很脆弱，很容易受到挫折或失败。<br />　　当然，员工认同，是一种自觉自愿自发，而不是被管理者甚至
制度被逼无奈的强制性认同。例如，安然的&ldquo;压力锅&rdquo;文化，是一种劣文化。这种企业文化与正常健康的企业文化不同，它不是员工自觉接受，而是趋于压力而被迫
接受，在这种恶劣文化影响的环境下，员工的价值观受到扭曲，企业的发展走向歧途。<br />　　安然公司的倒闭震惊世界，但从其企业文化角度分析，也是必
然。因为它的经营理念是为获得成功不择手段，对内部员工采取残酷的优胜劣汰制度，即&ldquo;压力锅&rdquo;文化。前安然公司石油和天然气勘探部门负责人福里斯特&middot;霍格
伦说：&ldquo;驱动力是一种非凡的形象，并且使其业绩记录不断上升。&rdquo;但是这种&ldquo;只能成功&rdquo;的格言在这种环境下，使偷窃他人成果变成很平常的事情。一位安然公司
的员工心有余悸地描述到，&ldquo;在公司中处处感受到尔虞我诈、弱肉强食，下班时不但要把文件资料锁在柜子里，还要仔细检查一遍，以免被同事窃取，使自己的劳动
成果化为乌有&rdquo;。在安然，失败者总是中途出局，获胜者会留下来，获得做成最大交易的那些人可以得到数百万美元的奖金。 <br />　　这是安然公司的&ldquo;赢者获得一切&rdquo;企业文化的缩影。该公司的雇员说，必须保持安然股价持续上升的压力，诱使高级管理者在投资和会计程序方面
冒更大的风险。他们说，其结果就是虚报收入和隐瞒越来越多的债务。从而造成了&ldquo;一座用纸牌搭成的房子&rdquo;。安然公司恶劣畸形的企业文化把自己放置在火山口
上，导致安然毁灭倒闭也不足为奇。 <br />　　一定意义上讲，企业未来之争，是企业文化的竞争。只有企业文化丰厚并得到员工认同的企业，才有内涵，才有凝聚力、才有活力，才有竞争力。企业只有坚持培育自己的文化，坚持走自己的路，始终不移地去执行所信奉的理念，形成自己的核心竞争力，才能做大做强做久，笑到最后</td></tr></tbody></table></td></tr></tbody></table>]]></description>
		</item>
		    
		
		<item>
			<title>编译 boost_python 步骤</title>
			<link>http://acloudblog.blog.sohu.com/95748179.html</link>
			<comments>http://acloudblog.blog.sohu.com/95748179.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Mon, 28 Jul 2008 15:33:02 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/95748179.html</guid>
			<description><![CDATA[1 打开项目 boost_python.dsw<br />&nbsp;&nbsp;&nbsp; &quot;&lt;...&gt;\boost_1_33_0\libs\python\build\VisualStudio\boost_python.dsw&quot;<br />2 将 VC 的头文件路径包含 &quot;&lt;...&gt;\Python25\include&quot;<br />3 将 VC 的库文件路径包含 &quot;&lt;...&gt;\Python25\libs&quot;<br />4 按 VC 生成,生成文件在 &quot;&lt;...&gt;\boost_1_33_0\libs\python\build\bin-stage\&quot; 下面。<br /><br />上文中的&lt;...&gt;是指安装路径，需要根据实际磁盘位置替换掉。<br />]]></description>
		</item>
		    
		
		<item>
			<title>c++中嵌入python入门(转)</title>
			<link>http://acloudblog.blog.sohu.com/95747656.html</link>
			<comments>http://acloudblog.blog.sohu.com/95747656.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Mon, 28 Jul 2008 15:28:54 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/95747656.html</guid>
			<description><![CDATA[<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
<!--[if !mso]><object
 classid="clsid:38481807- CA0E- 42D2- BF39- B33AF135CC4D" id=ieooui></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]-->
<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso- style- name:普通表格;
	mso- tstyle- rowband- size:0;
	mso- tstyle- colband- size:0;
	mso- style- noshow:yes;
	mso- style- parent:"";
	mso- padding- alt:0cm 5.4pt 0cm 5.4pt;
	mso- para- margin:0cm;
	mso- para- margin- bottom:.0001pt;
	mso- pagination:widow- orphan;
	font- size:10.0pt;
	font- family:"Times New Roman";
	mso- fareast- font- family:"Times New Roman";
	mso- ansi- language:#0400;
	mso- fareast- language:#0400;
	mso- bidi- language:#0400;}
</style>
<![endif]-->


<h1><span><a href="http://blog.csdn.net/cyblueboy83/archive/2007/12/25/1967005.aspx">c++<span><span>中嵌入python</span></span><span><span>入门(转)</span></span></a></span></h1>

<p>转自：<span>http://blog.csdn.net/cyblueboy83/archive/2007/12/25/1967005.aspx</span></p>

<p>本人是用<span>vc2003+python2.5</span>学习的，其它的也应该差不了多少<span></span></p>

<p><span>0. </span>坏境设置<span><br />
</span>把<span>python</span>的<span>include/libs</span>目录分别加到<span>vc</span>的<span>include/lib directories</span>中去。另外，由于<span>python</span>没有提供<span>debug lib</span>，大体地说，就是没有提供<span>python25_d.lib</span>了。你可以自己编译<span>python</span>的源代码来得到<span>python25_d.lib</span>的，偶还没试过， 呵呵。而且网上找了一下也没下载到。所以，如果你想要在<span>debug</span>下运行程序的话，你要把<span>pyconfig.h</span>（在<span>python25/include/</span>目 录下）的大概是在<span>283</span>行，把<span>pragma comment(lib,&quot;python25_d.lib&quot;)</span>改成<span>pragma comment(lib,&quot;python25.lib&quot;)</span>，让<span>python</span>都使用非<span>debug lib.</span></p>

<p><span>1. </span>开始编程了<span><br />
#include &lt;python.h&gt;<br />
</span>第一步就是包含<span>python</span>的头文件<span></span></p>

<p><span>2. </span>看一个很简单的例子<span><br />
1)python</span>文件<span>test.py</span>，很简单的定义了一个函数<span></span></p>

<p><span>#Filename test.py<br />
def Hello():<br />
&nbsp;&nbsp;&nbsp; print &quot;Hello, world!&quot;</span></p>

<p>这个应该能看懂的吧？否则的话，回去再练练<span>python</span>吧，呵呵。《简明<span>Python</span>教程》<span>Swaroop, C. H. </span>著。沈洁元<span>&nbsp; </span>译。<span></span></p>

<p><span><br />
2)cpp</span>文件<span></span></p>

<p><span>#include &lt;python.h&gt; //</span>包含头文件，在<span>c++</span>中嵌入<span>python</span>，这是必须的<span><br />
int main()<br />
{<br />
&nbsp;Py_Initialize();</span></p>

<p><span>&nbsp;PyObject * pModule = NULL;<br />
&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;</span></p>

<p><span>&nbsp;pModule = PyImport_ImportModule(&quot;test&quot;);<br />
&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, &quot;Hello&quot;);<br />
&nbsp;PyEval_CallObject(pFunc, NULL);</span></p>

<p><span>&nbsp;Py_Finalize();</span></p>

<p><span>&nbsp;return 0;<br />
}</span></p>

<p>第一步还是包含头文件<span></span></p>

<p>第二步，使用<span>python</span>之前，要调用<span>Py_Initialize();</span>这个函数进行初始化。<span><br />
</span>帮助文档中如是说：<span><br />
The basic initialization function is Py_Initialize(). This initializes the
table of loaded modules, and creates the fundamental modules __builtin__,
__main__, sys, and exceptions. It also initializes the module search path
(sys.path). </span></p>

<p>反正，一开始你一定要调用。<span></span></p>

<p>第三步，声明一些<span>Python</span>的变量，<span>PyObject</span>类型的。其实声明也可放在前面，这个倒是无所谓的。<span></span></p>

<p>第四步，<span>import module</span>，也就是你的脚本名字，不需要加后缀名，否则会出错的。<span></span></p>

<p>第五步，从你<span>import</span>进来的<span>module</span>中得到你要的函数<span><br />
&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, &quot;Hello&quot;);<br />
</span>上面的例子已经够清楚的了，最后一个是你要得到的函数的名字<span></span></p>

<p>第六步，调用<span>PyEval_CallObject</span>来执行你的函数，第二个参数为我们要调用的函数的函数，本例子不含参数，所以设置为<span>NULL</span>。<span></span></p>

<p>第七步，调用<span>Py_Finalize</span>，这个根<span>Py_Initialize</span>相对应的。一个在最前面，一个在最后面。<span></span></p>



<p>第一次写教程。这个例子非常简单，本人也还在学习当中阿，只能保证大家能够把这个例子运行起来。建议大家去看<span>python</span>的<span>documentaion</span>，里面有讲怎么<span>embedding python</span>的。先写到这里，其实目前也只学到这么多，呵呵。下次学了更多以后再写。<span></span></p>

]]></description>
		</item>
		    
		
		<item>
			<title>Eclipse 概述(转)</title>
			<link>http://acloudblog.blog.sohu.com/95390380.html</link>
			<comments>http://acloudblog.blog.sohu.com/95390380.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Thu, 24 Jul 2008 10:13:18 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/95390380.html</guid>
			<description><![CDATA[<div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr valign="top"><td><h1>用 Eclipse 和 Ant 进行 Python 开发</h1>转自：http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/<br /><br /><p><em>用 Eclipse IDE 和 Apache Ant 构建工具进行 Python 开发</em></p><img alt="" src="http://www.ibm.com/i/c.gif" width="1" height="6" /></td><td><img alt="developerWorks" src="http://www-128.ibm.com/developerworks/i/dw.gif" width="192" height="18" /></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0"><tbody><tr valign="top"><td><img alt="" src="http://www.ibm.com/i/c.gif" width="10" height="1" /></td><td><table align="right" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img alt="" src="http://www.ibm.com/i/c.gif" width="10" height="1" /></td><td><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="vertical-align: top;"><br /></td></tr><tr><td>文档选项</td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img alt="" src="http://www.ibm.com/i/c.gif" width="8" height="1" /></td></tr><tr valign="top"><td><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif" /></td><td><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif" /></td><td><p><span>未显示需要 JavaScript
的文档选项</span></p></td></tr><table style="width: 143px; height: 42px;" border="0" cellpadding="0" cellspacing="0"><tbody><tr valign="top"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="8" height="1" /></td><td><br /></td><td><p><a href="#"><b><br /></b></a></p></td></tr></tbody></table></tbody></table><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--></td></tr></tbody></table><p>级别： 初级</p><p><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#author">Ron Smith</a> (<a href="mailto:ron.smith@rpstechnologies.net?subject=%E7%94%A8%20Eclipse%20%E5%92%8C%20Ant%20%E8%BF%9B%E8%A1%8C%20Python%20%E5%BC%80%E5%8F%91">ron.smith@rpstechnologies.net</a>), 负责人<br /></p><p>2004 年  6 月  01 日</p><blockquote>Python
是一种非常灵活强大的动态脚本编程语言，具有完整的面向对象特性。众多的支持者指出，Python
语言与其他语言相比能更快更有效地表达出他们的意图。但是从 Java 技术&trade; 或 Microsoft&reg; .NET 刚刚转到 Python
的人会发现，功能丰富而精致的 IDE 和开发工具都不见了。那些开发人员可以从他们熟悉的 Java
开发工具中找到解决方案。本文着重介绍了如何使用基于 Java 技术的流行开发工具 Eclipse 和 Ant 进行 Python 开发。</blockquote><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->

<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
			<p><a name="N10042"><span>简介</span></a></p>
			<p>多
年以来， Java 语言和 Python 阵营之间一直存在大量的异花授粉现象。在这方面作出突出表率的可能是 Jython。这是一个纯粹用
Java 实现的 Python 运行时环境。按照这一说法，您将研究如何用 Eclipse IDE 和 Ant 构建与部署工具实现 Python
开发。Eclipse 和 Ant 是非常流行的工具，它们特性丰富、可扩展性强、而且开放源代码；Python 也具有相同的品质。PyDev 和
PyAntTasks 分别是 Eclipse 和 Ant 的扩展，有了它们就可能用这些 Java 工具开发
Python。本文从下载安装所需的工具与扩展开始讲起。为了解释如何在 Python 开发中使用 Eclipse 和 Ant，我将用实际的
Python 代码例子读取 RSS 资源。
</p>
			<p>本文不会涉及 Eclipse、Ant、Python 的细节。有关这些话题的深入讨论，请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a> 一节中的链接。
      </p>
			<p><a name="N10052"><span>Python 支持情况</span></a></p>
			<p>本
文用到的软件都在 CPython 2.3 下测试过。除了几个异常情况之外，应该也能在 Jython 中运行。特别需要指出，PyDev
调试器目前不支持 Jython。另一个区别是通过 Jython 执行的脚本在从 PyDev
中运行之后就转入交互模式，这样就必须手动杀死。PyDev 编辑器与 Jython 的源代码兼容，Python Ant 任务除 py-doc
任务之外也和 Jython 兼容。
</p>
			<br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td></tr></tbody></table><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /></td><td valign="top" align="right"><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#main"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1005B"><span>使用 Eclipse 进行 Python 开发</span></a></p>
			<p><a name="N10061"><span>Eclipse 概述</span></a></p>
			<p>Eclipse
是一个 Java 技术集成开发环境，由 IBM 开发，并开放其源代码。它是 IBM 商业软件 WebSphere Application
Development 环境以及其他多种工具的基础。Eclipse 的开发社区非常活跃，他们不仅开发 Eclipse 本身，还开发大量的插件供
Eclipse 使用。有关 Eclispe 和 Eclipse 插件的 Web 站点，请参阅 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a> 一节中的链接。尽管从传统上讲 Eclipse 是一种 Java 开发工具，但是一些插件的存在使得在 Eclipse 中开发其他语言的程序成为可能，如 C/C++、Python 和 Perl。
      </p>
			<p>在
Eclipse 中，源代码被组织到项目（project）中。项目可以加载、卸载和导入。Eclipse
用户界面的结构划分为视图（View）与编辑器（Editor）。视图与编辑器的例子包括：源代码大纲视图、Java 源代码编辑器、Python
源代码编辑器和文件系统导航视图。Eclipse 用户界面中最关键的隐含概念就是 <i>视角（perspective）</i>。视角是通常在执行某种类型活动时一起使用的一组视图。Eclipse
中的标准视角包括：Debug、Java Browsing、Java、Java Type Hierarchy、Plug-in
Development、CVS Repository Exploring、Resource 和
Install/Update。目前还不存在单独的 Python 视角。在进行 Python 开发时，我通常使用 Resource 视角和
Debug 视角。 </p>
			<p><a name="N10074"><span>安装 PyDev</span></a></p>
			<p>首先，从 Eclipse Web 站点上下载 Eclipse（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a> 一节中的链接），并根据您的平台，按照下面的安装指南安装 Eclipse：
      </p>
			<p>Eclipse 的更新机制使 PyDev 插件的安装更加容易。从 Eclipse 中选择
        <b>Help &gt; Software Updates &gt; Update Manager</b>，
启动 Install/Update 视角。在左下角的 Feature Updates 视图中，将 PyDev 插件更新站点作为新的 Site
Bookmark 添加到&ldquo;Sites to Visit&rdquo;文件夹下。Eclipse 的 PyDev 更新站点 URL 为
http://pydev.sf.net/updates/。现在，Feature Updates 编辑器中应该显示出&ldquo;PyDev&rdquo;这一特性。在
Feature Updates 编辑器中，展开 <b>PyDev  &gt; Other</b>，选择其中显示的 PyDev 特性（至少应该是 0.4.1）。然后选择 &ldquo;Install Now&rdquo;安装该特性。Eclipse 将下载 PyDev 插件，并将其安装到 Eclipse 中。
      </p>
			<p><a name="N1008A"><span>导入样例项目</span></a></p>
			<p>为访问本项目中使用的样例代码，可先下载 zip 文件（请参阅
        <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a>一节），在文件系统中展开该 zip 文件，然后将其中的项目导入 Eclipse。导入项目的方法是先切换到 Resource 视角，选择
        <b>File &gt; Import</b>，再选择&ldquo;Existing Project into Workspace&rdquo;，然后选择您展开 zip 文件的位置。这时，Navigator 视图中应该出现 feedParserTest 项目。
      </p>
			<p>
样例项目中已经包含了 Fead Parser 通用资源解析库，该库按 Python 开放源代码许可协议发布。有关 Feed Parser 项目 Web 网站的链接，请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a> 一节。
      </p>
			<br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td></tr></tbody></table><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /></td><td valign="top" align="right"><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#main"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100A1"><span>PyDev 漫游</span></a></p>
			<p>
现在开始学习如何通过已导入的项目了解 PyDev 的特性。PyDev 正处于开发过程中，但已经是非常高效的 Python 开发环境。现在的 PyDev 主要包括以下特性：</p>
			<ul><li>包含 Python 语法高亮显示特性的 Python 编辑器。</li><li>进行 Python 语法分析，并在 Python 编辑器和 Tasks 视图中高亮显示错误。</li><li>可将制表符转换成空格的选项。</li><li>Outline 视图显示导入的库、类以及函数。</li><li>终端视图中的 Python 堆栈跟踪信息可超链接到源代码中。</li><li>源代码内部的超链接；同一模块内的导入和函数调用可通过超链接进行导航。</li><li>从 Navigator 视图中运行 Python 脚本的能力。</li><li>调试器支持断点、代码单步执行以及显示变量的值。</li></ul>
			<p><a name="N100C5"><span>PyDev 选项窗口</span></a></p>
			<p>
通过 
        <b>Window &gt; Preferences</b>，并选择 PyDev（请参阅图 1），便可访问 PyDev 选项。第一组选项可以改变 PyDev 在源代码中处理制表符的方式，还可以改变语法元素的颜色。
      </p>
			
				<br /><a name="N100D3"><b>图 1. PyDev 选项窗口</b></a><br />
				<img alt="PyDev 选项窗口" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/pyDevPrefs.jpg" />
			<br />
			<p><a name="N100E0"><span>设置 Python 解释器</span></a></p>
			<p>
PyDev Debug 选项可以选择 Python 解释器，供执行 Python 代码时使用。如果 PyDev 无法找到 Python 解释器，或者想使用别的解释器，可在此设置（请参阅图 2）。
</p>
			
				<br /><a name="N100EB"><b>图 2. PyDev Debug 选项</b></a><br />
				<img alt="PyDev Debug 选项" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/pyDevDebugPrefs.jpg" />
			<br />
			<p><a name="N100F8"><span>处理源代码</span></a></p>
			<p>
我的大部分 Python 工作都是在 Resource 视角中完成的。使用方法是先切换到 Resource 视角，然后在左上角的
Navigator 视图中双击 feedParserTest/src/feedparserTest/FeedparserTest.py
文件。Python 编辑器打开该文件，对 Python 语法进行解析，完成设置颜色和语法检查的工作（请参阅图 3）。
</p>
			
				<br /><a name="N10103"><b>图 3. Python 编辑器</b></a><br />
				<img alt="Python 编辑器" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/pythonEditor.jpg" />
			<br />
			<p>
如果源代码中有任何错误，则显示在右下角的 Tasks 视图中显示出来。双击 Tasks 视图中的错误，便可找到那条讨厌的代码行。
</p>
			<p>Outline
视图在左下角，其中用一种便于浏览的结构显示出当前正在编辑的文件。导入的库、类、函数全都显示出来，通过双击 Outline
视图中的项目，便可以实现导航。PyDev 在编辑 Python 文件的过程中对齐进行预先解析的工作，同时更新 Outline
视图，执行语法检查，并用不同颜色显示语法元素。
</p>
			<p><a name="N10116"><span>编辑器的特性</span></a></p>
			<p>
PyDev 0.4 版在 Python 源代码编辑器中为函数和导入库加入了超链接的特性。如果在越过某项导入或函数调用（必须在 
        <code>PYTHONPATH</code> 目录中）的同时按下 Control 键，PyDev 就能显示出一个超链接，这样您可以在导入库或函数的源代码之间导航。请注意，为了在您自己的源代码中跨模块使用该特性（从一个模块链接到另一个模块），必须修改 
        <code>PYTHONPATH</code> 环境变量，在其中加入这些模块，这样 PyDev 就可以找到它们了。
      </p>
			<p>
人们已经开始将一些优异的源代码编辑特性加入最新版本的 PyDev 中，其中就包括代码块注释与取消注释，以及代码左右移位（请参阅图 4）。
</p>
			
				<br /><a name="N1012C"><b>图 4. PyDev 编辑器的其他特性</b></a><br />
				<img alt="PyDev 编辑器的其他特性" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/editorFeatures.jpg" />
			<br />
			<p><a name="N10139"><span>运行 Python 脚本</span></a></p>
			<p>
如果不能执行代码，那么 IDE 也不是太有用。为执行 Python 代码，可从 Navigator 视图中选择 feedparser.py 文件，用右键点击，然后选择 
        <b>Python &gt; Run</b>。随后会显示 Python 的启动配置窗口（请参阅图 5）。
      </p>
			
				<br /><a name="N10147"><b>图 5. Python 启动配置</b></a><br />
				<img alt="Python 启动配置" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/pythonLaunch.jpg" />
			<br />
			<p>Python
启动配置窗口中可以定义脚本执行的当前目录，传递给脚本的参数，以及用哪一个 Python 解释器运行脚本。feedparser.py 以一个
RSS URL 作为参数，所以可在参数字段中填入 URL，如
http://www.ibm.com/developerworks/news/dw_dwtp.rss。其余的缺省定义就可以了，所以单击 <b>Run</b>。
      </p>
			<p>
脚本执行时输出信息显示在 Console 窗口中。如果有错误出现，Console 窗口中将显示堆栈跟踪信息，其中的每一行都可以通过超链接找到 Python 源代码。
</p>
			<p><a name="N1015D"><span>Python 调试器</span></a></p>
			<p>Python
调试器是最近才加入 PyDev 插件中的。要使用调试器，可在 Python 编辑器中想中断的代码行的左侧点击，设置断点。在图 6 中，我在
feedparser.py 的 1830 行处设置了断点。然后在 Navigator 视图中选择这个 Python
模块，点击右键，选择&ldquo;Python &gt; Debug...&rdquo;。这时将显示与前面相似的一个启动配置窗口。点击 <b>Debug</b> 进入 Debug 视角，同时启动调试器。
      </p>
			
				<br /><a name="N1016B"><b>图 6. Python 调试器</b></a><br />
				<img alt="Python 调试器" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/debugger.jpg" />
			<br />
			<p>
左上角的 Debug 视图显示当前正在执行的进程和线程，右上角的 Variables 视图显示当前运行域中的所有变量，Python
编辑器会显示调试器目前停在哪条语句上，同时所有的输出信息都显示与 Console 视图中。调试器可以通过 Debug 视图底部的按钮或 Run
菜单进行控制。
</p>
			<p><a name="N1017B"><span>其他 Eclipse 特性</span></a></p>
			<p>
Eclipse 及其插件还具备很多其他的特性，可应用于 Python 开发中，如 XML 编辑器、UML 编辑器（不过大多数是以 Java 代码为中心），还有资源控制方面的插件。目前 Eclipse 插件站点上列出的插件几乎有 500 个（请参阅 
        <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a> 一节中的相关链接）。我将着重介绍一个对很多 Python 开发人员都特别有用的插件：Eclipse 发行版中已经包括的 CVS 插件，不过不会讨论细节内容。
      </p>
			<p>
Eclipse 中包括特性丰富的集成 CVS：</p>
			<ul><li>支持 SSH、pserver、ext 等连接方法。</li><li>基本 CVS 命令的支持：检出项目、提交变更、更新、向.cvsignore 中增加文件或模式等等。</li><li>文件合并查看。</li><li>在源代码控制中实现对文件不同之处的比较。</li><li>项目同步，并用资料库显示出删除和新增的内容。</li></ul>
			<p>
还可以通过提供其他插件来支持其他源代码控制系统，如 ClearCase、Subversion、Visual SourceSafe 等。
</p>
			<br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td></tr></tbody></table><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /></td><td valign="top" align="right"><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#main"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101A0"><span>在 Eclipse 中使用 Python 的交互式 shell</span></a></p>
			<p>
Python 解释器支持 Python 代码的交互式执行。这种方式对于调试一段代码是非常有用的，因为不用把代码放进 Python 脚本中并执行脚本了。同时，Python 解释器的交互模式可以很容易地集成到 Eclipse 中。
</p>
			<p>
要增加对 Python 交互式执行的支持，可通过 
        <b>Run &gt; External Tools &gt; External Tools</b>
增加一个 External Tool 启动程序。这时将打开 External Tool 启动程序配置窗口。在 Configurations
列表中选择&ldquo;Program&rdquo;，然后点击&ldquo;New&rdquo;创建一个新的配置。将该配置命名为诸如 &quot;pythonInteractive&quot; 之类，然后设置
Location，令其指向您的 Python 解释器，接着，将 &quot;-i&quot; 作为唯一的参数传递进来（请参阅图 7）。 </p>
			<p>
在 Common 选项卡下，选中复选框，使该配置在 External Tools 收藏夹菜单中显示出来。
</p>
			
				<br /><a name="N101B4"><b>图 7. Python 交互方式配置</b></a><br />
				<img alt="Python 交互方式配置" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/pythonInteractiveConfig.jpg" />
			<br />
			<p>
要运行刚刚在 Eclipse 中创建的启动器，可选择 
        <b>Run &gt; External Tools &gt; pythonInterpreter</b>。Python 解释器的输出显示在 Console 视图中。Console 中可输入 Python 命令并执行，就像从命令行中执行 Python 一样。为导入并在交互模式下使用模块，您需要将模块的位置增加到 
        <code>PYTHONPATH</code> 环境变量中。
      </p>
			<p>
在 Eclipse Console 中执行 Python 与用命令行执行的不同之处在于，无法启用命令历史特性（通过向上和向下的方向键实现），因为 Eclipse Console 会自己解释这些键。
</p>
			<br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" width="100%" height="1" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td></tr></tbody></table><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" alt="" width="16" border="0" height="16" /><br /></td><td valign="top" align="right"><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#main"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101CE"><span>在 Python 开发中使用 Ant</span></a></p>
			<p>
Python 会在它需要的时候自动编译模块。这意味着 Python 开发人员通常不必显式地对模块进行编辑。即便如此，有时候手工编译 Python 代码还是很有用的，同时，构建和部署过程中还有很多其他方面的内容可以自动化实现。这也正是构建工具的用武之地。
</p>
			<p>
我将着重介绍来自 Java 编程世界中的 Apache Ant，这个工具可大量应用在 Python 开发中。Apache Ant 是 Java
编程领域内事实上的标准构建工具。它更加轻便，与 Java 技术结合得更好，可用于替代其他的构建工具。Ant 可以在支持 Java
编程语言的任何一种平台上运行。尽管我们需要的大多数构建特性 Ant 都已经提供了，但如果要将 Ant 用做 Python
构建工具，还是需要有一些关键的与 Python 相关的特性。我已经开发了若干定制的 Ant 插件（用 Ant 的行话讲叫做
task），可提供构建 Python 时需要的特定于 Python 的特性。
</p>
			<p>Ant 用 XML 作为描述构建的格式。build
文件组织为需要执行的目标。每一个目标都可能依赖于其他的目标。Ant
将根据您所请求执行的目标，以及一组依赖目标，来执行任何需要的目标。每一个目标都可能包含任意数量的 Ant 任务，而由 Ant
任务实际执行目标的工作。Ant 有很多内置的任务，可以完成诸如编译 Java
代码、生成文档、操纵文件和目录，同时第三方又提供了很多附加的任务。
</p>
			<p><a name="N101DD"><span>安装 Python Ant 库</span></a></p>
			<p>
我将通过为 feedparser 项目创建构建脚本来介绍 Ant 构建脚本和 Python Ant 任务的基础知识。为了使用 Python Ant 任务，您需要下载并安装包含这些任务的 Java 库。首先，从 
        <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/#resources">参考资料</a>
一节中列出的 URL 中下载 Python Ant 任务库（pyAntTasks.jar）。然后，将 JAR 文件拷贝到 Eclipse 的
Ant 插件下的 lib 目录中。这应该是 Eclipse 安装目录下形如 plugins/org.apache.ant_1.5.3
的子目录。 </p>
			<p>
Python Ant 任务库拷贝完毕之后，必须在 Eclipse 中启用库。选择 
        <b>Window &gt; Preferences</b>，然后选择
        <b>Ant &gt; Runtime</b>。
将 Ant Home Entries 展开，其中可看到 Eclipse 使用的库（JAR 文件）列表。选择&ldquo; Add JAR&rdquo;，然后从
Eclipse Ant 插件的 lib 目录中选择 Python Ant JAR 文件，就可以将刚刚拷贝的 Python Ant JAR
文件加入库列表中（请参阅图 8）。 </p>
			
				<br /><a name="N101F5"><b>图 8. 向 classpath 中加入 Python Ant 任务</b></a><br />
				<img alt="向 classpath 中加入 Python Ant 任务" src="http://www-128.ibm.com/developerworks/cn/opensource/os-ecant/addPyAntTasks.jpg" />
			<br />
			<p>
您现在应该能够创建和运行包含 Python 任务的 Ant 构建脚本了。下面进入构建脚本内部！
</p>
			<p><a name="N10205"><span>创建构建脚本</span></a></p>
			<p>
我将逐步介绍如何创建一个简单的 Python 构建脚本（请参阅清单 1）。完整的构建脚本 build.xml 可从 feedParserTest 项目的顶层目录中找到。
</p>
			<br /><a name="N1020E"><b>清单 1. 用于编译 Python 源代码的构建脚本片断</b></a><br />
			<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><pre>&lt;project name=&quot;feedParserTest&quot; default=&quot;compile&quot;&gt;<br />  &lt;taskdef resource=&quot;pyAntTasks.properties&quot;/&gt;<br />  &lt;property name=&quot;src.dir&quot; value=&quot;src&quot;/&gt;<br />  &lt;target name=&quot;compile&quot;&gt;<br />    &lt;py-compile dir=&quot;${src.dir}&quot; pythonpath=&quot;${src.dir}&quot; optimize=&quot;0&quot;/&gt;<br />  &lt;/target&gt;<br />&lt;/project&gt;<br /></pre></td></tr></tbody></table><br />
			<p>
先介绍一个只编译 Python 样例代码的构建脚本。&lt;project&gt; 标签总是构建脚本的根标签。&lt;taskdef&gt; 标签声明在整个构建脚本中使用的 Python 任务。在构建脚本的底部，可以定义 
        <code>compile</code> 目标。目标元素内部是 
        <code>compile</code>
运行期间执行的任务。特别的是 py-compile 任务，它负责从 src 目录开始，编译所有的 Python
代码。该任务会递归遍历所有的子目录，并编译所有的 Python 模块。脚本中没有采用将 src
目录硬编码到调用之处的方式，而是在构建脚本中定义了称为 src.dir 的属性。然后，在需要使用这个目录名的时候，就可以通过 <code>${src.dir}</code> 来引用。
      </p>
			<p>
要运行构建脚本，可从 Eclipse 中打开它。Eclipse 具有内置的 Ant 构建脚本编辑和浏览功能。Outline 视图可以显示出构建脚本的结构。在 Navigator 视图中，选择该构建脚本，用右键点击，然后选择&ldquo;Run Ant...&rdquo;。选择 
        <code>compile</code> 目标，然后点击&ldquo;Run&rdquo;。构建脚本执行过程中的输出信息应该显示在 Console 视图中，表示运行成功。
      </p>
			<p><a name="N1022E"><span>Python 脚本执行任务</span></a></p>
			<p>
接下来将向构建脚本中加入新的目标，用于执行 Python 脚本（请参阅清单 2）。在本例中，可以将 RSS URL 作为参数来执行 feedparser.py 脚本。
</p>
			<br /><a name="N10237"><b>清单 2. 运行 feedparser 脚本的构建脚本片断</b></a><br />
			<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><pre>  &lt;target name=&quot;run.feedparser&quot; depends=&quot;compile&quot;&gt;<br />    &lt;py-run script=&quot;src/feedparser/feedparser.py&quot; pythonpath=&quot;${src.dir}&quot; optimize=&quot;0&quot;&gt;<br />      &lt;arg value=&quot;http://www.ibm.com/developerworks/news/dw_dwtp.rss&quot;&gt;<br />    &lt;/py-run&gt;<br />  &lt;/target&gt;<br /></pre></td></tr></tbody></table><br />
			<p>
上面的目标以 RSS URL 为唯一的参数来执行 feedparser.py 脚本。该目标声明为依赖于 
        <code>compile</code> 目标，所以后者将首先执行。实际上这一步并不是很必要，因为 Python 会根据需要自动编译源代码。如果您执行 
        <code>run.feedparser</code> 目标，就会运行 feedparser.py 脚本，同时将 RSS 的内容输出到 Console 中。
      </p>
			<p><a name="N1024C"><span>Python 文档任务</span></a></p>
			<p>
Python 的 API 文档编制机制与 Java 技术中的 JavaDoc 系统类似，称为 PyDoc。在构建脚本中加入清单 3 中列出的如下 XML 片断，可为所有的 Python 模块生成 PyDoc。
</p>
			<br /><a name="N10255"><b>清单 3. 用于生成 PyDoc 的构建脚本片断</b></a><br />
			<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><pre> 1:  &lt;property name=&quot;pydoc.dir&quot; value=&quot;pydoc&quot;/&gt;<br /> 2:<br /> 3:  &lt;target name=&quot;init&quot;&gt;<br /> 4:    &lt;mkdir dir=&quot;${pydoc.dir}&quot;/&gt;<br /> 5:  &lt;/target&gt;<br /> 6:<br /> 7:  &lt;target name=&quot;pydoc&quot; depends=&quot;init,compile&quot;&gt;<br /> 8:    &lt;py-doc pythonpath=&quot;${src.dir}&quot; destdir=&quot;${pydoc.dir}&quot;&gt;<br /> 9:      &lt;fileset dir=&quot;${src.dir}&quot;&gt;<br />10:        &lt;include name=&quot;**/*&quot;/&gt;<br />11:      &lt;/fileset&gt;<br />12:    &lt;/py-doc&gt;<br />13:  &lt;/target&gt;<br /></pre></td></tr></tbody></table><br />
			<p>
				<code> 
从对上述 pydoc 目标的解析可看出，第 7 行声明了目标名称，并指出它依赖于 
        <code>init</code> 和 
        <code>compile</code> 目标。这意味着在运行 pydoc 目标之前，Ant 必须保证 
        <code>init</code> 和 
        <code>compile</code> 目标已经运行，如果没有，则首先运行这两个目标。
      </code></p>
			<p>
				<code>pydoc</code> 目标所依赖的 
        <code>init</code> 目标在第 3 至第 5 行定义。 
        <code>init</code> 目标仅仅创建了一个存放 PyDoc API 文档文件的目录。如前所述，要为所生成文档的保存位置定义一个属性，名为 pydoc.dir。
      </p>
			<p>
第 8 行开始是 py-doc 任务。如前所述，您传入生成 pydoc 过程中所使用的 
        <code>PYTHONPATH</code> 。 
        <code>destdir</code> 属性告诉 py-doc 任务将生成的 HTML 文档输出到何处。
      </p>
			<p>
第 9 至第 11 行定义了在生成文档的过程中应该处理哪些 Python 源文件。文件集是 Ant
脚本中通用的结构，可用于定义所操作的一组文件。这是一种很强大的特性，它使您能够通过名字模式、布尔逻辑和文件属性来选择所要操作的文件。Ant
文档中有这方面的完整描述。本例中递归选择了&ldquo;src&rdquo;目录下的所有文件。
</p>
			<p><a name="N10292"><span>Python 单元测试任务</span></a></p>
			<p>Python
中具有标准的单元测试框架（从 Python 2.3 开始。在 Python 2.2 中这只是可选模块），与 Java jUnit
框架十分类似。测试用例的结构与 jUnit
采用相同的方式。每一个待测试的类和模块通常都具有自己的测试类。测试类中包含测试装置（fixture），它们在 <code>setUp</code> 函数中初始化。每一个测试都编写为测试类中的一个独立的测试函数。unittest 框架会在测试函数之间循环往复，先调用 
        <code>setUp</code> 、再测试函数、然后清除（ 
        <code>tearDown</code> ）测试函数。请参阅清单 4 中的样例。
      </p>
			<br /><a name="N102A7"><b>清单 4. Python 单元测试模块</b></a><br />
			<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><pre>import unittest<br />from pprint import pprint<br />import feedparser<br />class FeedparserTest(unittest.TestCase):<br />    &quot;&quot;&quot;<br />    A test class for the feedparser module.<br />    &quot;&quot;&quot;<br />    <br />    def setUp(self):<br />        &quot;&quot;&quot;<br />        set up data used in the tests.<br />        setUp is called before each test function execution.<br />        &quot;&quot;&quot;<br />        self.developerWorksUrl = &quot;testData/developerworks.rss&quot;       <br />    def testParse09Rss(self):<br />        &quot;&quot;&quot;<br />        Test a successful run of the parse function for a<br />        0.91 RSS feed.<br />        &quot;&quot;&quot;<br />        print &quot;FeedparserTest.testParse09RSS()&quot;<br />        <br />        result = feedparser.parse(self.developerWorksUrl)<br />        pprint(result)<br />        self.assertEqual(0, result['bozo'])<br />        <br />        self.assert_(result is not None)<br />        channel = result['channel']<br />        self.assert_(channel is not None)<br />        chanDesc = channel['description']<br />        self.assertEqual(u'The latest content from IBM developerWorks',<br />            chanDesc)<br />        <br />        items = result['items']<br />        self.assert_(items is not None)<br />        self.assert_(len(items)&gt; 3)<br />        firstItem = items[0]<br />        title = firstItem['title']<br />        self.assertEqual(u'Build installation packages with <br />            solution installation and deployment technologies',<br />            title)<br />  <br />    def tearDown(self):<br />        &quot;&quot;&quot;<br />        tear down any data used in tests<br />        tearDown is called after each test function execution.<br />        &quot;&quot;&quot;<br />        pass<br />                <br />if __name__ == '__main__':<br />    unittest.main()<br /></pre></td></tr></tbody></table><br />
			<p>
上述清单是实现 feedparser 模块基本测试功能的测试类。完整的测试类见 feedParserTest 项目下的 src/feedparserTest/FeedparserTest.py。 
        <code>setUp</code> 函数负责准备整个测试过程中需要使用的测试装置，在本例中只有测试用的 RSS 文件的目录，测试函数将对其进行解析。 
        <code>testParse09Rss</code>
是真正的测试函数。这个函数调用 feedparser.parse 函数，传递测试用的 RSS 文件，输出解析结果，并通过 TestCase
类的 assert 函数执行基本的检查统作。如果任何 assert 的求值结果不是真，或是在执行过程中抛出任何异常，unittest
就会报告一次测试失败或错误。最后的两行负责在这个测试类内部运行测试，方法是直接运行该模块即可。 </p>
			<p>
要独立运行该测试类，可以按前面所说的相同方式运行 FeedparserTest.py 模块。在 Eclipse Navigator 视图中选择 FeedparserTest.py，然后通过 
        <b>Python &gt; Run</b>
运行。此时显示启动配置窗口。除 Base 目录之外，其他都保持缺省值即可。Base 目录必须是 feedParserTest
项目的目录，这样才能在当前目录下找到 RSS 文件（testData/developerworks.rss）。修改 base
目录的设置，然后点击&ldquo;Run&rdquo;。输出信息显示在 Console 上。 </p>
			<p>
您也许希望我们编写的所有单元测试都能够作为构建的一部分自动执行。将下面清单 5 所示的构建片断加入构建脚本便可实现。
</p>
			<br /><a name="N102C5"><b>清单 5. 执行单元测试的构建脚本片断</b></a><br />
			<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><pre>1:  &lt;target name=&quot;tests&quot; depends=&quot;compile&quot;&gt;<br />2:	&lt;py-test pythonpath=&quot;${src.dir}&quot; dir=&quot;.&quot;&gt;<br />3:  	  &lt;fileset dir=&quot;${src.dir}&quot;&gt;<br />4:		&lt;include name=&quot;**/*Test.py&quot;/&gt;<br />5:	  &lt;/fileset&gt;<br />6:  	&lt;/py-test&gt;<br />7:  &lt;/target&gt; <br /></pre></td></tr></tbody></table><br />
			<p>
第一行是目标声明，这与其他的脚本相同。第 2 至第 6 行调用 py-test 任务。这部分代码将在&ldquo;src&rdquo;目录下查找所有以&ldquo;Test.py&rdquo;结尾的所有文件，并运行所有测试。 
        <code>PYTHONPATH</code> 设置为&ldquo;src&rdquo;，测试执行的当前工作目录就是当前目录（&lsquo;.&rsquo;）。
      </p>
			<p>
运行目标的方法是先运行构建脚本，再选择执行&ldquo;tests&rdquo;目标。该目标将运行所有以&ldquo;Test.py&rdquo;结尾的测试用例，本例中仅有 FeadparserTest.py。
</p></td></tr></tbody></table></div>]]></description>
		</item>
		    
		
		<item>
			<title>在 Eclipse 中安裝 PyDev（转）</title>
			<link>http://acloudblog.blog.sohu.com/95338634.html</link>
			<comments>http://acloudblog.blog.sohu.com/95338634.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Wed, 23 Jul 2008 17:08:16 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/95338634.html</guid>
			<description><![CDATA[<div>
						<h3><a href="http://blog.cyberjos.idv.tw/space/2008-04-30/1">在 Windows 的 Eclipse 中撰寫 Python 程式 (2) - 在 Eclipse 中安裝 PyDev</a></h3>
					</div>
					<div>
					
					
					
						<div>本文转自 http://blog.cyberjos.idv.tw/space/2008-04-30/1 。<br /><br />Category:<a href="http://blog.cyberjos.idv.tw/category/300">Java 與程式設計</a></div>
					
					</div>	
					<div>
						安裝好 Python 之後，就可以在命令提示字元的視窗中輸入 <span>python</span> 來執行 Python 程式（前提是有先設好 PATH 變數）。當然如果我們要撰寫大量的程式碼時，使用文字編輯器或編譯器會是比較好的方式。下列介紹如何使用 <a href="http://www.eclipse.org/" title="http://www.eclipse.org">Eclipse</a> 來撰寫 Python 程式。<p>Eclipse 是一套知名的 Java 程式編譯器，它有著許多豐富的外掛程式。其中一項名為 <a href="http://pydev.sourceforge.net/" title="http://pydev.sourceforge.net/">PyDev</a> 的外掛程式可以讓我們在 Eclipse 中撰寫並編譯、執行及除錯 Python 的程式碼。你可以直接到 <a href="http://pydev.sourceforge.net/download.html" title="http://pydev.sourceforge.net/download.html">PyDev 的下載頁面</a> 來下載，目前的版本是 1.3.15，支援 Eclipse 3.3、Python 2.3.x or 2.4.x。<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/2.png" alt="2.png" width="650" /></p><p>我
們使用的從 Eclipse 中直接安裝 PyDev，如此一來如果日後有新版本的話，那麼直接在 Eclipse 中更新即可，比較方便。開啟
Eclipse 後點擊選單「Help」/「Software Updates」/「Find and
Install...」。在跳出軟體安裝的視窗後，我們選擇「Search for new features to install」圓鈕：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/11.png" alt="11.png" /></p><p>點擊「Next」按鈕後，接著就是要新增軟體安裝來源的網址。首先點擊「New Remote Site」按鈕，並填入 Name: PyDev、URL: <span><a href="http://pydev.sourceforge.net/updates/">http://pydev.sourceforge.net/updates/</a></span>，接著按下「OK」按鈕，此時我們已經成功新增一筆安裝來源網址了。在確認「Site to include in search:」清單中 PyDev 項目有打勾之後，按下「Finish」按鈕：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/12.png" alt="12.png" /></p><p>按下「Finish」按鈕之後 Eclipse 會連線搜尋（請確定電腦是否能順利上網），接著會出現搜尋結果視窗。此處僅需要勾選「PyDev for Eclipse 1.3.15」項目，其他的都不用勾選：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/13.png" alt="13.png" /></p><p>選擇「Next」之後，便開始 PyDev 的安裝過程。第一步會先有版權宣告：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/14.png" alt="14.png" /></p><p>第二步是選擇安裝目錄。當然此處我們都是直接點選「Finish」按鈕，因為預設它會直接安裝在 Eclipse 的目錄下：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/15.png" alt="15.png" /></p><p>第三步開始下載 PyDev 套件：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/16.png" alt="16.png" /></p><p>第四步下載完成後，Eclipse 會跳出確認視窗，詢問你是否真的要安裝此一套件。此處直接選擇「Install」：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/17.png" alt="17.png" /></p><p>第五步正式安裝：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/18.png" alt="18.png" /></p><p>第六步安裝完成，Eclipse 會提示你要重新啟動程式才可以跑 PyDev：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/19.png" alt="19.png" /></p><p>重開 Eclipse 後，我們就可以開始寫 Python 程式了。中間為程式碼區塊、左方為專案及檔案目錄的樹狀架構區、右方為程式碼摘要，以及下方為程式執行結果、搜尋結果、待辦事項、程式碼片斷清單、伺服器管理等小工具面板：<br />
<img src="http://blog.cyberjos.idv.tw/files/2008-04-30/1/20.png" alt="20.png" />

					</p></div>]]></description>
		</item>
		    
		
		<item>
			<title>重构 &#8212; 改善既有的类图设计 条款9：用Pimpl惯用法隐藏细节</title>
			<link>http://acloudblog.blog.sohu.com/94520286.html</link>
			<comments>http://acloudblog.blog.sohu.com/94520286.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Mon, 14 Jul 2008 15:59:45 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/94520286.html</guid>
			<description><![CDATA[<font size="5">重构 &mdash; 改善既有的类图设计<br />条款9：用Pimpl惯用法隐藏细节</font><br /><br /><b>黄国强 2008/7/14</b><br /><br />重构前的代码。<br />// UseBySample.h<br />class CUseBySample<br />{<br />public:<br />&nbsp;&nbsp;&nbsp; CUseBySample(void); <br />&nbsp;&nbsp;&nbsp; ~CUseBySample(void); <br />};<br /><br />class CSample<br />{<br />public:<br />&nbsp;&nbsp;&nbsp; CSample(void); <br />&nbsp;&nbsp;&nbsp; ~CSample(void); <br />&nbsp;&nbsp; &nbsp;<br />private:<br />&nbsp;&nbsp;&nbsp; CUseBySample m_UseBySample;<br />};<br />调用 CSample 的人来说，可以看到 CUseBySample。画图应该是这样。如图一所示。<br /><div align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/EntryImages/20080714/18.gif" /><br /></div><div align="center">图一<br /></div><br /><br />重构后的代码。对调用 CSample 的人来说，CUseBySample 就好像不存在一样。<br /><br />// Sample.h<br /><br />class CSampleImpl;<br /><br />class CSample<br />{<br />public:<br />&nbsp;&nbsp;&nbsp; CSample(void); <br />&nbsp;&nbsp;&nbsp; ~CSample(void); <br /><br />private:<br />&nbsp;&nbsp;&nbsp; std::auto_ptr&lt;CSampleImpl *&gt; m_Pimpl;<br />};<br /><br />// SampleImpl.h<br />class CSampleImpl<br />{<br />public:<br />&nbsp;&nbsp;&nbsp; CSampleImpl(void); <br />&nbsp;&nbsp;&nbsp; ~CSampleImpl(void); <br /><br />private:<br />&nbsp;&nbsp;&nbsp; CUseBySample m_UseBySample;<br />};<br /><div align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/EntryImages/20080714/19.gif" /><br /></div><div align="center">图二<br /></div>图二演示了重构后的图，在这里，CSampleImpl 与 CSample 之间指针是从 CSampleImpl 指向 CSample。理由是，CSample 当作了接口，CSampleImpl 为 CSample 的实现类，故我认为应该这样画。]]></description>
		</item>
		    
		
		<item>
			<title>重构 &#8212; 改善既有的类图设计 条款8：消除继承类和基类中重复的依赖关系</title>
			<link>http://acloudblog.blog.sohu.com/89906273.html</link>
			<comments>http://acloudblog.blog.sohu.com/89906273.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Thu, 12 Jun 2008 13:56:33 +0800</pubDate>
			<category>软件工程</category>
			<guid>http://acloudblog.blog.sohu.com/89906273.html</guid>
			<description><![CDATA[<font size="4">重构 &mdash; 改善既有的类图设计<br /></font><font style="font-family: 宋体;" size="4">条款8：消除继承类和基类中重复的依赖关系</font><br /><br /><font size="3"><span style="font-family: 黑体;">黄国强 2008/5/12</span></font><br /><br />&nbsp;&nbsp;&nbsp; 大家再读本条条款之前，请先读一下&ldquo;条款4：消除重复的依赖关系&rdquo;。本条款目的和条款4，只是表现形式不同。<br />见图 1。<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/393338/o_16.gif" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /><br /><div style="text-align: center;">图1<br /></div>&nbsp;&nbsp;&nbsp; 图中类1依赖于类3，类2也依赖于类3。在这里类2和类3之间是聚合关系，聚合关系的依赖方向是从菱形箭头指向直线的另一端。相当多的人把这个依赖关系搞反了。聚合关系的符号有一个演变之前，请看图2。相信看过这个图后，以后依赖关系应该不会搞错了。<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/393338/o_16_1.gif" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /><br /><div style="text-align: center;">图2<br /></div>&nbsp;&nbsp;&nbsp; 这里的重构是要消除重复的依赖关系，结果见图3。我们把类1和类3之间的依赖线拿掉了。<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/393338/o_17.gif" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /><br /><div style="text-align: center;">图3</div>]]></description>
		</item>
		    
		
		<item>
			<title>重构 &#8212; 改善既有的类图设计 条款7：为每个角色增加一个接口</title>
			<link>http://acloudblog.blog.sohu.com/89393080.html</link>
			<comments>http://acloudblog.blog.sohu.com/89393080.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Fri, 6 Jun 2008 10:19:39 +0800</pubDate>
			<guid>http://acloudblog.blog.sohu.com/89393080.html</guid>
			<description><![CDATA[<font size="4">重构 &mdash; 改善既有的类图设计<br />条款7：为每个角色增加一个接口</font><br /><font size="3"><span style="font-family: 黑体;">黄国强 2008/6/6</span></font><br /><br />&nbsp;&nbsp;&nbsp; 单一职责原则（Single Responsibility Principle，SRP）[1] Robert C. Martin 是这样解释的：Each class should have one and only one reason to change.一个类只能因为一个因素而改变。<br />&nbsp;&nbsp;&nbsp; 从上面所述可以看出，单一职责是针对一个类的。但是我这里有个不同观点，即，单一职责是针对接口的。现实的例子，是我们每个人都承担了太多的职责，这是客观存在的。每个人只承担一个职责，这是理想状态，非常少见。请看图 1 。<br /><div style="text-align: center;"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/393338/o_14.gif" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /></div><div style="text-align: center;">图 1<br /></div>&nbsp;&nbsp;&nbsp; 图中类4被类1、2、3调用。承担了为三种不同类型的类服务的职责。根据单一职责原理，重构如图2 。<br /><div style="text-align: center;"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/acloudhuang/393338/o_15.gif" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /></div><div style="text-align: center;">图 2<br /></div>&nbsp;&nbsp;&nbsp; 图2 中我增加了接口1、2、3，而原先的类4从这三个接口中继承。重构后带来了一个好处，即将类4和类1、2、3解耦。未来，如果需求发生变化，觉得类4过于庞大和复杂，可以将类4重写或分拆。而类1、2、3对此将一无所知。<br />&nbsp;&nbsp;&nbsp; 现实的例子，比如一个小公司，就老板一个人，他就要从事从总经理到员工所有的职位的工作。面对不同的客户，他拿出不同职位的名片。随着公司的发展，他会按职位招聘一些符合这些职位的人。让这些人分担他的职责。在这里。老板就是图1的类4，而总经理职位、部门经理职位、员工职位等就是接口1、2、3。<br /><br /><br />[1] 敏捷软件开发：原则、模式与实践 英文原名 Agile Software Development: Principles, Patterns, and Practices<br />作者&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Robert C.Martin<br />清华大学出版社 | 出版日期 : 2003 年 9 月]]></description>
		</item>
		    
		
		<item>
			<title>重构 &#8212; 改善既有的类图设计 条款6：模块的防火墙</title>
			<link>http://acloudblog.blog.sohu.com/88566320.html</link>
			<comments>http://acloudblog.blog.sohu.com/88566320.html#comment</comments>
			<dc:creator>acloud的blog</dc:creator>
			<pubDate>Tue, 27 May 2008 17:03:06 +0800</pubDate>
			<category>软件工程</category>
			<guid>http://acloudblog.blog.sohu.com/88566320.html</guid>
			<description><![CDATA[<div style="text-align: center;"><font size="5">重构 &mdash; 改善既有的类图设计<br />条款6：模块的防火墙</font><br /></div><div style="text-align: center;"><font size="3"><span style="font-family: 黑体;">黄国强 2008/5/27</span></font><br /></div><br /><div style="text-align: center;"><br /></div><div style="text-align: center;"><a href="http://pp.sohu.com/photoview-197816423-26602.html" target="_blank"><img src="http://1802.img.pp.sohu.com.cn/images/blog/2008/5/27/17/1/11ace5109e3.jpg" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /></a></div><div style="text-align: center;">图 1 <br /></div>&nbsp;&nbsp;&nbsp; 看图 1 ，一个模块由A、B、C 三个类 组成，外部类可以访问类 A 。从图上看，外部类通过类 A 开始的依赖箭头可以访问到类 B 和 C 。显然这个模块的细节也暴露给外部类了。<br />&nbsp;&nbsp;&nbsp; 如果在设计上不想让外部类看到这个模块的细节，如何我们应该如何做到这点呢？请看图 2 。<br /><br /><div style="text-align: center;"><a href="http://pp.sohu.com/photoview-197816558-26602.html" target="_blank"><img src="http://1812.img.pp.sohu.com.cn/images/blog/2008/5/27/17/1/11ace4d1492.jpg" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" border="0" /></a></div><div style="text-align: center;">图 2 <br /></div>&nbsp;&nbsp;&nbsp; 从图 2 看出，外部类只能看到类 A_Factory_Proxy、I_A_Factory 和 InterFace_A 。类 A、B、C 对外部类来说是不可见的。这里出现的类 InterFace_A 起到了防火墙的作用。工厂代理类 A_Factory_Proxy 的解释请看&ldquo;<a href="http://acloudblog.blog.sohu.com/88030283.html" target="_blank">条款 5 </a>&rdquo;的描述。<br />]]></description>
		</item>
		    
		
	</channel>
</rss>
