<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[飞鸟的天空 - Python资料]]></title>
<link>http://www.cmuch.com/</link>
<description><![CDATA[What you are you do not see,What you see is your shadow.]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[cn_vipus@yahoo.com.cn(cn_vipus)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>飞鸟的天空</title>
	<url>http://www.cmuch.com/images/logos.gif</url>
	<link>http://www.cmuch.com/</link>
	<description>飞鸟的天空</description>
</image>

			<item>
			<link>http://www.cmuch.com/article.asp?id=247</link>
			<title><![CDATA[SyntaxError: from __future__ imports must occur ..]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Python资料]]></category>
			<pubDate>Tue,24 Feb 2009 16:08:36 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=247</guid>
		<description><![CDATA[<span style="font-size:11pt"><br/>昨天下午开始用PYTHON写一个SOAP程序,开始时参考dive into python里的例子和说明, 但实践中发现不够用,网上的文档又很少,自己摸索了半天才初步搞定,下面是其中碰到的一 些问题,写下来给和我一样的SOAP初学者参考,如果有不对或者不足的地方,请高手指正:<br/><br/>1、安装 按照dive into python的说明，安装这三个库：PyXML, fpconst 和 SOAPpy 其中PyXML在SF的下载地址： <a href="http://sourceforge.net/project/showfiles.php?group_id=6473" target="_blank" rel="external">http://sourceforge.net/project/showfiles.php?group_id=6473</a>没有py2.5的版本，请到 这里下载： <a href="http://platea.pntic.mec.es/~jmorilla/python/PyXML-0.8.4.win32-py2.5.exe" target="_blank" rel="external">http://platea.pntic.mec.es/~jmorilla/python/PyXML-0.8.4.win32-py2.5.exe</a><br/><br/>SOAPpy安装时会报错：SyntaxError:from __future__ imports must occur at the beginning of the file。这时需要改一下安装目录下SOAPpy目录中的个文件：Client.py Types.py Server.py，把from __future__ import nested_scopes移到第一行就可以了。<br/><br/>2、调试 强烈建议打开调试模式： from SOAPpy import WSDL server = WSDL.Proxy(&#39;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#39;) server.soapproxy.config.dumpSOAPOut = 1 server.soapproxy.config.dumpSOAPIn = 1 server.soapproxy.config.debug = 9 还有，最好下载一个SOAP的调试工具，我用的是soapUI，很好用。可以把调试信息直接粘贴 到soapUI中，改某些数据，看能不能运行。<br/><br/>3、要点 a、header 这是我构造出来的东东： &lt;SOAP-ENV:Header&gt; &lt;ns1:AuthHeader xmlns:ns1=&#34;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#34; SOAP- ENC:root=&#34;1&#34;&gt; &lt;username xsi:type=&#34;xsd:string&#34;&gt;xxxxx&lt;/username&gt; &lt;pas://platea.pntic.mec.es/~jmorilla/python/PyXML-0.8.4.win32- py2.5.exe<br/><br/>SOAPpy安装时会报错：SyntaxError:from __future__ imports must occur at the beginning of the file。这时需要改一下安装目录下SOAPpy目录中的个文件：Client.py Types.py Server.py，把from __future__ import nested_scopes移到第一行就可以了。<br/><br/>2、调试 强烈建议打开调试模式： from SOAPpy import WSDL server = WSDL.Proxy(&#39;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#39;) server.soapproxy.config.dumpSOAPOut = 1 server.soapproxy.config.dumpSOAPIn = 1 server.soapproxy.config.debug = 9 还有，最好下载一个SOAP的调试工具，我用的是soapUI，很好用。可以把调试信息直接粘贴 到soapUI中，改某些数据，看能不能运行。<br/><br/>3、要点 a、header 这是我构造出来的东东： &lt;SOAP-ENV:Header&gt; &lt;ns1:AuthHeader xmlns:ns1=&#34;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#34; SOAP- ENC:root=&#34;1&#34;&gt; &lt;username xsi:type=&#34;xsd:string&#34;&gt;xxxxx&lt;/username&gt; &lt;password xsi:type=&#34;xsd:string&#34;&gt;123456&lt;/password&gt; &lt;/ns1:AuthHeader&gt; &lt;/SOAP-ENV:Header&gt; 用这几行构造出来的： from SOAPpy import structType from SOAPpy import headerType ct = structType(data = {&#39;password&#39; : &#39;123456&#39;,&#39;username&#39;:&#39;xxxxx&#39;}) ct._validURIs = [] ct._ns = (&#34;ns1&#34;, &#34;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#34;) hd = headerType(data = {&#34;AuthHeader&#34; : ct}) server.soapproxy.header = hd<br/><br/>b、body SOAPpy似乎有缺陷，我用的这个WSDL中定义了getWordRequest方法，隶属于getWord，供其 output时使用，但SOAPpy解析不出这个方法，只解析出getWord，我只好这么做： server.methods[&#39;getWordRequest&#39;]=server.methods[&#39;getWord&#39;] server.methods[&#39;getWordRequest&#39;].namespace =&#39;<a href="https://www.xxxxx.com/" target="_blank" rel="external">https://www.xxxxx.com/</a> xxxx&#39; 变通了一下。还有一个更土的办法是把WSDL下载下来，修改一下。不知道有没有更好的办法 。<br/><br/>另外，某个方法的参数是这样定义的?/www.xxxxx.com/xxxx&#34; SOAP-ENC:root=&#34;1&#34;&gt; &lt;username xsi:type=&#34;xsd:string&#34;&gt;xxxxx&lt;/username&gt; &lt;password xsi:type=&#34;xsd:string&#34;&gt;123456&lt;/password&gt; &lt;/ns1:AuthHeader&gt; &lt;/SOAP-ENV:Header&gt; 用这几行构造出来的： from SOAPpy import structType from SOAPpy import headerType ct = structType(data = {&#39;password&#39; : &#39;123456&#39;,&#39;username&#39;:&#39;xxxxx&#39;}) ct._validURIs = [] ct._ns = (&#34;ns1&#34;, &#34;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#34;) hd = headerType(data = {&#34;AuthHeader&#34; : ct}) server.soapproxy.header = hd<br/><br/>b、body SOAPpy似乎有缺陷，我用的这个WSDL中定义了getWordRequest方法，隶属于getWord，供其 output时使用，但SOAPpy解析不出这个方法，只解析出getWord，我只好这么做： server.methods[&#39;getWordRequest&#39;]=server.methods[&#39;getWord&#39;] server.methods[&#39;getWordRequest&#39;].namespace =&#39;<a href="https://www.xxxxx.com/" target="_blank" rel="external">https://www.xxxxx.com/</a> xxxx&#39; 变通了一下。还有一个更土的办法是把WSDL下载下来，修改一下。不知道有没有更好的办法 。<br/><br/>另外，某个方法的参数是这样定义的： server.getWordRequest(strWord=&#39;2&#39;) 我觉得有点特殊，结果如下：<br/><br/>&lt;SOAP-ENV:Body&gt; &lt;ns1:getWordRequest xmlns:ns1=&#34;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#34; SOAP- ENC:root =&#34;1&#34;&gt; &lt;strWord xsi:type=&#34;xsd:string&#34;&gt;2&lt;/strWord&gt; &lt;/ns1:getWordRequest&gt; &lt;/SOAP-ENV:Body&gt;<br/><br/>c、namespace<br/><br/>c、namespace 我没找到定义全局namespace的办法，只好在header和body分别定义，呵呵，笨了一些。 namespace很重要，一定要定义，不然就出错，其实就是上面的两句： ct._ns = (&#34;ns1&#34;, &#34;<a href="https://www.xxxxx.com/xxxx" target="_blank" rel="external">https://www.xxxxx.com/xxxx</a>&#34;) server.methods[&#39;getWordRequest&#39;].namespace =&#39;<a href="https://www.xxxxx.com/" target="_blank" rel="external">https://www.xxxxx.com/</a> xxxx&#39; <br/></span>]]></description>
		</item>
		
</channel>
</rss>
