<?xml version="1.0" encoding="UTF-8"?>
<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:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps技术分享 &#187; PYTHON</title>
	<atom:link href="http://www.showerlee.com/archives/tag/python/feed" rel="self" type="application/rss+xml" />
	<link>http://www.showerlee.com</link>
	<description>与你共同学习运维开发</description>
	<lastBuildDate>Mon, 19 Oct 2020 05:51:41 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Kubernetes之python client连接k8s API cluster</title>
		<link>http://www.showerlee.com/archives/2804</link>
		<comments>http://www.showerlee.com/archives/2804#comments</comments>
		<pubDate>Tue, 23 Oct 2018 14:01:25 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[DevTools]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=2804</guid>
		<description><![CDATA[大家在平时使用k8s可以说用到的最多的命令应该就是kubectl, 这个命令默认会在master上安装并与本地 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	大家在平时使用<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>可以说用到的最多的命令应该就是kubectl, 这个命令默认会在master上安装并与本地的<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a> API cluster绑定token认证, 实现日常<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>的数据交互. 不过问题在于, 如果我们需要远程调用<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a> API或者需要实现<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>自动化集成, 仅靠每次远程ssh集成使用kubectl命令这种偷懒的办法是远远不够的.
</p>
<p>
	这里<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>官方给我们提供了两种比较主流的连接k8s API cluster的语言, 一种是GO, 另外一种就是我们DevOps比较主流的Python.
</p>
<p>
	今天这里我将给大家介绍如何使用python client扩展包去编写脚本并远程连接k8s API cluster.
</p>
<p>
	这样我们平时除了可以远程使用ssh+kubectl去与kubernetes进行命令行数据交互外, 同样可以在远程不依赖命令行直接连接k8s cluster API cluster, 与k8s进行python API交互, 方便我们后期利用python去对k8s进行自动化集成与二次开发.
</p>
<p>
	
</p>
<p>
	这里我们不多说, 直接进入我们的runbook配置环节:
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	<span style="font-size:16px;color:#337FE5;"><strong>一.部署python client环境连接我们的k8s API cluster.</strong></span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">1.安装python3.6.5源及依赖包</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;"># yum install epel-release -y</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# yum groupinstall "Development tools" -y
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel zx-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel -y
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">2.编译安装python3.6.5以及pip package manager</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# wget <a href="https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz" rel="nofollow">https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz</a> --no-check-certificate
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# tar xf Python-3.6.5.tar.xz
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# cd Python-3.6.5
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# ./configure --prefix=/usr/local --with-ensurepip=install --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# make &amp;&amp; make altinstall
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">3.安装virtualenv</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	#&nbsp;pip3.6 install --upgrade pip
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	#&nbsp;pip3.6 install virtualenv
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">4.配置加载virtualenv环境</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# <span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">virtualenv -p /usr/local/bin/python3 .py3env</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">#&nbsp;source .py3env/bin/activate</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p><span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#337FE5;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">5.安装kubernetes python client扩展包</span></span> </p>
<p>
	<span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># pip install kubernetes</span></span>
</p>
<p>
	<span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><br />
</span></span>
</p>
<p>
	<span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><strong><span style="font-size:16px;color:#337FE5;">二.在k8s master获取API cluster URL与token</span></strong></span></span>
</p>
<p>
	<span style="color:#000000;">我们需要在创建python脚本前, 在k8s主机上创建一个admin权限的service account, 并获取其token 用来作为我们的脚本凭证.</span>
</p>
<p>
	<span style="color:#337FE5;">1.抓取Cluster URL地址</span>
</p>
<p>
	# APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
</p>
<p>
	# echo $APISERVER
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;">2.创建k8s admin-user</span>
</p>
<p>
	<span style="color:#000000;"># mkdir -p /kube/role</span>
</p>
<p>
	<span style="color:#000000;"># cd /kube/role</span>
</p>
<p>
	在kube-system下创建admin-user
</p>
<p>
	<span style="color:#000000;"># vi&nbsp;<span>CreateServiceAccount.yaml</span> </span>
</p>
<pre class="prettyprint">apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system</pre>
<p>
	给admin-user赋予admin权限
</p>
<p># vi CreateServiceAccount.yaml</p>
<pre class="prettyprint">apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system</pre>
<p>#&nbsp;kubectl create -f CreateServiceAccount.yaml<br />
#&nbsp;kubectl create -f RoleBinding.yaml</p>
<p><span style="color:#337FE5;">3.获取admin-user token</span> </p>
<p>
	# Token=$(kubectl describe secret $(kubectl get secret -n kube-system | grep ^admin-user | awk '{print $1}') -n kube-system | grep -E '^token'| awk '{print $2}')
</p>
<p>
	# echo $Token
</p>
<p>
	<span style="color:#E53333;">最后将token与APISERVER地址返回内容复制到python client主机上, 供脚本使用.</span>
</p>
<p>
	
</p>
<p>
	<span style="font-size:16px;"><strong><span style="color:#337FE5;">三</span></strong><span style="color:#337FE5;"><strong>. 在python client主机上编写脚本</strong></span></span>
</p>
<p>
	<span style="color:#337FE5;">1. 创建目录结构</span>
</p>
<p>
	# mkdir -p /kube/auth
</p>
<p>
	# cd /kube/auth
</p>
<p>
	# touch token.txt
</p>
<p><span style="color:#337FE5;">2. 创建token.txt文件并将k8s主机上获取的Token字符串复制到该文件</span> </p>
<p>
	<span style="color:#E53333;">这里我们获取的token会引入到我们的脚本下, 作为bearer authorization的api key与远程k8s API建立认证连接.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;">3. 编写python client脚本</span>
</p>
<p>
	# vi k8s_auth.py
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python


from kubernetes import client, config


def main():
    # Define the barer token we are going to use to authenticate.
    # See here to create the token:
    # <a href="https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/" rel="nofollow">https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/</a>

    with open('token.txt', 'r') as file:
        Token = file.read().strip('\n')

    APISERVER = 'https://10.110.16.14:6443'

    # Create a configuration object
    configuration = client.Configuration()

    # Specify the endpoint of your Kube cluster
    configuration.host = APISERVER

    # Security part.
    # In this simple example we are not going to verify the SSL certificate of
    # the remote cluster (for simplicity reason)
    configuration.verify_ssl = False

    # Nevertheless if you want to do it you can with these 2 parameters
    # configuration.verify_ssl=True
    # ssl_ca_cert is the filepath to the file that contains the certificate.
    # configuration.ssl_ca_cert="certificate"
    configuration.api_key = {"authorization": "Bearer " + Token}

    # configuration.api_key["authorization"] = "bearer " + Token
    # configuration.api_key_prefix['authorization'] = 'Bearer'
    # configuration.ssl_ca_cert = 'ca.crt'
    # Create a ApiClient with our config
    client.Configuration.set_default(configuration)

    # Do calls
    v1 = client.CoreV1Api()
    print("Listing pods with their IPs:")
    ret = v1.list_pod_for_all_namespaces(watch=False)
    for i in ret.items:
        print("%s\t%s\t%s" %
              (i.status.pod_ip, i.metadata.namespace, i.metadata.name))


if __name__ == '__main__':
    main()</pre>
<p>
	<span style="color:#E53333;">这个脚本通过抓取同目录的k8s token字符串, 以及我们之前获取到的api server地址,利用python kubernetes扩展模块连接我们的远程API, 最终实现打印我们k8s所有namespace下的所有pods.</span>
</p>
<p>
	<span style="color:#E53333;">实际效果与kubectl get pods --all-namespaces类似.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;">4. 修改权限并执行</span>
</p>
<p>
	# chmod 755 k8s_auth.py
</p>
<p>
	# ./k8s_auth.py
</p>
<pre class="prettyprint lang-bsh">Listing pods with their IPs:
...
10.244.1.3	default	db
10.244.1.2	default	kubernetes-downwardapi-volume-example
10.244.1.245	default	nginx1-7-deployment-667547b6d8-c5nsr
10.244.1.239	default	nginx1-7-deployment-667547b6d8-mjxq4
10.244.1.247	default	nginx1-8-deployment-d46768cf9-888v8
10.244.1.242	default	nginx1-8-deployment-d46768cf9-fglq2
10.110.16.14	kube-system	etcd-kube-master
10.110.16.14	kube-system	kube-apiserver-kube-master
10.110.16.14	kube-system	kube-controller-manager-kube-master
10.244.1.241	kube-system	kube-dns-6f4fd4bdf-qsxrj
10.110.16.14	kube-system	kube-flannel-ds-5sdlg
10.110.16.15	kube-system	kube-flannel-ds-qctv4
10.110.16.14	kube-system	kube-proxy-5nscq
10.110.16.15	kube-system	kube-proxy-6g7jc
10.110.16.14	kube-system	kube-scheduler-kube-master
10.244.1.246	kube-system	kubernetes-dashboard-58f5cb49c-6dxgn
10.244.1.240	kube-system	tiller-deploy-cbb85d8dc-f6rsv
10.110.16.15	kube-system	traefik-ingress-lb-765c44656f-fkzxb
10.244.1.243	spinnaker	kubelive-create-bucket-wxlv4
10.244.1.244	spinnaker	kubelive-delete-jobs-zhn75</pre>
<p>这样我们就成功的编写完成python client脚本连接k8s API cluster, 将所有namespace下的pod的基本信息打印出来.</p>
<p>
	
</p>
<p>
	
</p>
<p>
	Finished...</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/2804">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Kubernetes之python client连接k8s API cluster" href="http://www.showerlee.com/archives/2804">http://www.showerlee.com/archives/2804</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/2804/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[Python] SMTP(SSL)发送邮件</title>
		<link>http://www.showerlee.com/archives/1464</link>
		<comments>http://www.showerlee.com/archives/1464#comments</comments>
		<pubDate>Thu, 27 Aug 2015 06:33:45 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1464</guid>
		<description><![CDATA[这里需要注意的是大家使用QQ邮箱(SMTL over SSL)时, 需要首先在其网页客户端后台打开SMTP/P [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	这里需要注意的是大家使用<span>QQ邮箱(<span>SMTL over SSL</span>)时</span>, 需要首先在其网页客户端后台打开SMTP/POP服务, 并且设置QQ邮箱独立密码作为SMTP登陆密码, 这样在使用MUA时就不会报Authentication failed的错误.
</p>
<p>
	QQ邮箱&nbsp;<span style="line-height:1.5;">POP3端口: 995&nbsp;</span><span style="line-height:1.5;">SMTP端口: 587</span>
</p>
<p>
	密码使用QQ邮箱独立密码
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib  
import email.encoders
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
import getpass

# Build a new attach instance
msg = MIMEMultipart()

# Mail configuration
Mail_subject = 'Python test mail'
Mail_content = 'Send with pic attachment'
Recipient_list = ['XXX@126.com', 'XXX@qq.com']
SMTP_server = "smtp.qq.com"  
SMTP_port = "587"
Username = raw_input('Please input your Username:')  
Password = getpass.getpass("Please input your Password: ")   
mail_postfix = "qq.com"  

# Mail attachment
def attach(file_path, file_name, type, postfix):
    with open(file_path + "/" + file_name, 'rb') as f:
        # 设置附件的MIME和文件名，这里是png类型:
        mime = MIMEBase(type, postfix, filename = file_name)
        # 加上必要的头信息:
        mime.add_header('Content-Disposition', 'attachment', filename = file_name)
        mime.add_header('Content-ID', '&lt;0&gt;')
        mime.add_header('X-Attachment-Id', '0')
        # 把附件的内容读进来:
        mime.set_payload(f.read())
        # 用Base64编码:
        email.encoders.encode_base64(mime)
        # 添加到MIMEMultipart:
        msg.attach(mime)

  
def send_mail(recipient, title, content): 
    # Mail info
    author = "%s&lt;%s@%s&gt;" %(Username, Username, mail_postfix)
    msg['Subject'] = title  
    msg['From'] = author  
    msg['To'] = ";".join(recipient)

    # Send attachment
    msg.attach(MIMEText(content, 'plain', 'utf-8'))
    attach('/Users/XXX/Pictures/com.tencent.ScreenCapture','QQ20150827-1.png', 'image', 'png')
    attach('/Users/XXX/Work/Python','test01.py', 'txt', 'py')
    attach('/Users/XXX/Work/Python','test.zip', 'zip', 'zip')

    try:  
        server = smtplib.SMTP(SMTP_server, SMTP_port)
        server.starttls()
        server.set_debuglevel(1)   
        server.login(Username, Password)  
        server.sendmail(author, recipient, msg.as_string())  
        server.quit()  
        return True  
    except Exception, e:
        print str(e)
        return False


if __name__ == '__main__': 
    if send_mail(Recipient_list, Mail_subject, Mail_content): 
        print "Sent Successfully"  
    else: 
        print "Sent Failure" </pre>
<p>
	
</p>
<div>
	
</div>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1464">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] SMTP(SSL)发送邮件" href="http://www.showerlee.com/archives/1464">http://www.showerlee.com/archives/1464</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1464/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Python] SMTP发送邮件</title>
		<link>http://www.showerlee.com/archives/1454</link>
		<comments>http://www.showerlee.com/archives/1454#comments</comments>
		<pubDate>Thu, 27 Aug 2015 05:01:51 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1454</guid>
		<description><![CDATA[这里PYTHON脚本实现的是登陆126的SMTP将邮件发送到QQ邮箱. QQ邮箱利用的是加密STMP, 需要加 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	这里<a href="http://www.showerlee.com/archives/tag/python" title="查看PYTHON中的全部文章" class="tag_link">PYTHON</a>脚本实现的是登陆126的SMTP将邮件发送到QQ邮箱.
</p>
<p>
	QQ邮箱利用的是加密STMP, 需要加密版本的童鞋请关注随后的更新.
</p>
<p>
	TIPS: 我的本地环境是MAC系统, Windows环境需要修改相应的字符编码.
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib  
import email.encoders
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
import getpass

# Build a new attach instance
msg = MIMEMultipart()

# Mail configuration
Mail_subject = 'Python test mail'
Mail_content = 'Send with attachments'
Recipient_list = ['XXX@126.com', 'XXX@qq.com']
SMTP_server = "smtp.126.com"  
Username = raw_input('Please input your Username:')  
Password = getpass.getpass("Please input your Password: ")   
mail_postfix = "126.com"  

# Mail attachment
def attach(file_path, file_name, type, postfix):
    with open(file_path + "/" + file_name, 'rb') as f:
        # 设置附件的MIME和文件名，这里是png类型:
        mime = MIMEBase(type, postfix, filename = file_name)
        # 加上必要的头信息:
        mime.add_header('Content-Disposition', 'attachment', filename = file_name)
        mime.add_header('Content-ID', '&lt;0&gt;')
        mime.add_header('X-Attachment-Id', '0')
        # 把附件的内容读进来:
        mime.set_payload(f.read())
        # 用Base64编码:
        email.encoders.encode_base64(mime)
        # 添加到MIMEMultipart:
        msg.attach(mime)

  
def send_mail(recipient, title, content): 
    # Mail info
    author = "%s&lt;%s@%s&gt;" %(Username, Username, mail_postfix)
    msg['Subject'] = title  
    msg['From'] = author  
    msg['To'] = ";".join(recipient)

    # send attachment
    msg.attach(MIMEText(content, 'plain', 'utf-8'))
    attach('/Users/XXX/Pictures/com.tencent.ScreenCapture','QQ20150827-1.png', 'image', 'png')
    attach('/Users/XXX/Work/Python','test01.py', 'txt', 'py')
    attach('/Users/XXX/Work/Python','test.zip', 'zip', 'zip')

    try:  
        server = smtplib.SMTP()
        server.set_debuglevel(1) 
        server.connect(SMTP_server)  
        server.login(Username, Password)  
        server.sendmail(author, recipient, msg.as_string())  
        server.quit()  
        return True  
    except Exception, e:
        print str(e)
        return False


if __name__ == '__main__': 
    if send_mail(Recipient_list, Mail_subject, Mail_content): 
        print "Sent Successfully"  
    else: 
        print "Sent Failure" </pre>
<p>
	
</p>
<p>
	</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1454">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] SMTP发送邮件" href="http://www.showerlee.com/archives/1454">http://www.showerlee.com/archives/1454</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1454/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Python] re(正则表达式)模块详解</title>
		<link>http://www.showerlee.com/archives/1441</link>
		<comments>http://www.showerlee.com/archives/1441#comments</comments>
		<pubDate>Fri, 24 Apr 2015 07:00:54 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1441</guid>
		<description><![CDATA[一、Python中转义字符 &#160; 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符，这里跟P [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">一、Python中转义字符</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符，这里跟Python的语法冲突，因此，Python用" \\\\ "表示正则表达式中的" \ "，因为正则表达式中如果要匹配" \ "，需要用\来转义，变成" \\ "，而Python语法中又需要对字符串中每一个\进行转义，所以就变成了" \\\\ "。</span><br />
<span style="font-family:Verdana;"> 上面的写法是不是觉得很麻烦，为了使正则表达式具有更好的可读性，Python特别设计了原始字符串(raw string)，需要提醒你的是，在写文件路径的时候就不要使用raw string了，这里存在陷阱。raw string就是用'r'作为字符串的前缀，如 r"\n"：表示两个字符"\"和"n"，而不是换行符了。Python中写正则表达式时推荐使用这种形式。</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">二、正则表达式元字符说明：</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">. &nbsp; &nbsp;匹配除换行符以外的任意字符</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">^ &nbsp; &nbsp;匹配字符串的开始</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">$ &nbsp; &nbsp;匹配字符串的结束</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">[] &nbsp; 用来匹配一个指定的字符类别</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">？ &nbsp; <span style="color:#505050;font-family:Verdana;font-size:14px;line-height:21px;background-color:#FFFFFF;">匹配</span>前一个字符字符0次到1次</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">* &nbsp; &nbsp;<span style="color:#505050;font-family:Verdana;font-size:14px;line-height:21px;background-color:#FFFFFF;">匹配</span>前一个字符0次到无穷次</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">+&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#505050;font-family:Verdana;font-size:14px;line-height:21px;background-color:#FFFFFF;">匹配</span><span style="color:#505050;font-family:Verdana;font-size:14px;line-height:21px;background-color:#FFFFFF;">前一个字符1次到无穷次</span></span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">{} &nbsp; 对于前一个字符重复m次</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">{m，n} 对前一个字符重复为m到n次</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\d &nbsp; 匹配数字，相当于[0-9]</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\D &nbsp; 匹配任何非数字字符，相当于[^0-9]</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\s &nbsp; 匹配任意的空白符，相当于[ fv]</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\S &nbsp; 匹配任何非空白字符，相当于[^ fv]</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\w &nbsp; 匹配任何字母数字字符，相当于[a-zA-Z0-9_]</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\W &nbsp; 匹配任何非字母数字字符，相当于[^a-zA-Z0-9_]</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">\b &nbsp; 匹配单词的开始或结束</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">三、导入正则表达式模块</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">3.1、导入正则表达式模块</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt; import &nbsp;re</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">3.2、查看正则表达式模块方法</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; dir(re)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']</span><br />
<span style="font-family:Verdana;"> &gt;&gt;&gt;</span></p>
<p><span style="font-family:Verdana;"> 四、常用的正则表达式处理函数</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">4.1、re.search</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; &nbsp;re.search 函数会在字符串内查找模式匹配，只到找到第一个匹配然后返回，如果字符串没有匹配，则返回None。</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 提示：当我们不会用模块方法的时候用help</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; help(re.search)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">search(pattern, string, flags=0)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 第一个参数：规则</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 第二个参数：表示要匹配的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 第三个参数：标致位，用于控制正则表达式的匹配方式</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 实例：下面的例子kuangl&nbsp;</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; name="Hello,My name is kuangl,nice to meet you..."</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; k=re.search(r'k(uan)gl',name)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; if k:</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">... &nbsp; &nbsp; print k.group(0),k.group(1)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">... else:</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">... &nbsp; &nbsp; print "Sorry,not search!"</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">...</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">kuangl uan</span><br />
<span style="line-height:1.5;"><br />
</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">4.2、re.match</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&nbsp; &nbsp; re.match 尝试从字符串的开始匹配一个模式，也等于说是匹配第一个单词</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; help(re.match)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">match(pattern, string, flags=0)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 第一个参数：规则</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 第二个参数：表示要匹配的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 第三个参数：标致位，用于控制正则表达式的匹配方式</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; 实例：下面的例子匹配Hello单词</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; name="Hello,My name is kuangl,nice to meet you..."</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; k=re.match(r"(\H....)",name)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt; if k:</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">... &nbsp; &nbsp; &nbsp;print k.group(0),'\n',k.group(1)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">... else:</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">... &nbsp; &nbsp; print "Sorry,not match!"</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">...</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">Hello</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">Hello</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt;</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&nbsp; &nbsp; &nbsp;re.match与re.search的区别：re.match只匹配字符串的开始，如果字符串开始不符合正则表达式，则匹配失败，函数返回None；而re.search匹配整个字</span><span style="font-family:Verdana;line-height:1.5;">串，直到找到一个匹配。</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">4.3、re.findall</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp; re.findall 在目标字符串查找符合规则的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; help(re.findall)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">findall(pattern, string, flags=0)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第一个参数：规则</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第二个参数：目标字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;但三个参数：后面还可以跟一个规则选择项</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;返回的结果是一个列表，建中存放的是符合规则的字符串，如果没有符合规则的字符串呗找到，就会返回一个空值。</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;实例：查找邮件账号</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; mail='&lt;user01@mail.com&gt; &lt;user02@mail.com&gt; <a href="mailto:user04@mail.com">user04@mail.com</a>' #第3个故意没有尖括号</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; re.findall(r'(\w+@m....[a-z]{3})',mail)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">['user01@mail.com', 'user02@mail.com', 'user04@mail.com']</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">4.4、re.sub</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;re.sub 用于替换字符串的匹配项</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; help(re.sub)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">sub(pattern, repl, string, count=0)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第一个参数：规则</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第二个参数：替换后的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第三个参数：字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第四个参数：替换个数。默认为0，表示每个匹配项都替换</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;实例：将空白处替换成-</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; test="Hi, nice to meet you where are you from?"</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; re.sub(r'\s','-',test)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">'Hi,-nice-to-meet-you-where-are-you-from?'</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; re.sub(r'\s','-',test,5) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#替换至第5个</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">'Hi,-nice-to-meet-you-where are you from?'</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt;</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">4.5、re.split</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;re.split 用于来分割字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; help(re.split)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">split(pattern, string, maxsplit=0)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&nbsp; &nbsp;第一个参数：规则</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&nbsp; &nbsp;第二个参数：字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&nbsp; &nbsp;第三个参数：最大分割字符串，默认为0，表示每个匹配项都分割</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&nbsp; &nbsp;实例：分割所有的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt; test="Hi, nice to meet you where are you from?"</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt; re.split(r"\s+",test)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">['Hi,', 'nice', 'to', 'meet', 'you', 'where', 'are', 'you', 'from?']</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt; re.split(r"\s+",test,3) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#分割前三个</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">['Hi,', 'nice', 'to', 'meet you where are you from?']</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="line-height:1.5;font-family:Verdana;">&gt;&gt;&gt;</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">4.6、re.compile</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;re.compile 可以把正则表达式编译成一个正则对象</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; help(re.compile)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">compile(pattern, flags=0)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第一个参数：规则</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;第二个参数：标志位&nbsp;</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&nbsp; &nbsp;实例：</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; test="Hi, nice to meet you where are you from?"</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; k=re.compile(r'\w*o\w*') #匹配带o的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; dir(k)</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; print k.findall(test) &nbsp; &nbsp; #显示所有包涵o的字符串</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">['to', 'you', 'you', 'from']</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt; print k.sub(lambda m: '[' + m.group(0) + ']',test) &nbsp;# 将字符串中含有o的单词用[]括起来</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">Hi, nice [to] meet [you] where are [you] [from]?</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">&gt;&gt;&gt;</span>
</p>
<p style="color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="font-family:Verdana;">五、用urllib2、re、os 模块下载文件的脚本</span>
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python

import urllib2
import re
import os
URL='http://image.baidu.com/channel/wallpaper'
read=urllib2.urlopen(URL).read()
pat =  re.compile(r'src="http://.+?.js"&gt;')
urls=re.findall(pat,read)
for i in urls:
    url= i.replace('src="','').replace('"&gt;','')
try:
    iread=urllib2.urlopen(url).read()
    name=os.path.basename(url)
    with open(name,'wb') as jsname:
    jsname.write(iread)
except:
    print url,"url error"</pre>
<p>
	
</p>
<div style="padding:0px;margin:0px;color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
</div>
<p>
	
</p>
<div style="padding:0px;margin:0px;color:#505050;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
</div>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1441">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] re(正则表达式)模块详解" href="http://www.showerlee.com/archives/1441">http://www.showerlee.com/archives/1441</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1441/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Python] List(列表),tuple(元组)和array的区别(转)</title>
		<link>http://www.showerlee.com/archives/1430</link>
		<comments>http://www.showerlee.com/archives/1430#comments</comments>
		<pubDate>Thu, 23 Apr 2015 06:56:54 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1430</guid>
		<description><![CDATA[Python中的列表(list)类似于C#中的可变数组（ArrayList），用于顺序存储结构。它可以方便、高 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	Python中的列表(list)类似于C#中的可变数组（ArrayList），用于顺序存储结构。它可以方便、高效的的添加删除元素，并且列表中的元素可以是多种类型。列表很多操作都跟元组一样，它们的不同在于元组是只读的，那更新列表的操作，比如切片操作来更新一部分元素的操作，就不能用于元组。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	在与array的比较中，值得注意的是，列表会使用更多的存储空间相对于array。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	通过import array导入python的数组类型，就可以使用array类型了。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	例如：
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	from array import array &nbsp;
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	node=array('H') &nbsp;
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	node.append(12) &nbsp;
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	python的array和C的数组很类似，它只能存储同样地数据类型的数据。它所占的存储空间的大小就是数据的大小。如果你相对一致类型的数据进行数学运算，那么，array将是一个很好的选择。并且它可以用于和C的代码做接口。或者可以说array就是披上了python外衣的C的数组。<br />
下面介绍一下常见操作：
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	创建列表
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	sample_list = ['a',1,('a','b')]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	Python 列表操作
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	sample_list = ['a','b',0,1,3]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	得到列表中的某一个值
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	value_start = sample_list[0]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	end_value = sample_list[-1]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	删除列表的第一个值
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	del sample_list[0]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	在列表中插入一个值
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	sample_list[0:0] = ['sample value']
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	得到列表的长度
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	list_length = len(sample_list)
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	列表遍历
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	for element in sample_list:
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	print(element)
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	Python 列表高级操作/技巧<br />
<span style="line-height:1.5;"><br />
</span>
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	<span style="line-height:1.5;">产生一个数值递增列表</span>
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	<span style="line-height:1.5;">num_inc_list = range(30)</span>
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	#will return a list [0,1,2,...,29]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	用某个固定值初始化列表
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	initial_value = 0
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	list_length = 5
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	sample_list = [ initial_value for i in range(10)]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	sample_list = [initial_value]*list_length
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	# sample_list ==[0,0,0,0,0]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	附：python内置类型
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	1、list：列表（即动态数组，C++标准库的vector，但可含不同类型的元素于一个list中）
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	a = ["I","you","he","she"] ＃元素可为任何类型。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	下标：按下标读写，就当作数组处理
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	以0开始，有负下标的使用
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	0第一个元素，-1最后一个元素，
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	-len第一个元 素，len-1最后一个元素
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	取list的元素数量
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	len(list) #list的长度。实际该方法是调用了此对象的__len__(self)方法。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	创建连续的list
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L = range(1,5) #即 L=[1,2,3,4],不含最后一个元素
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L = range(1, 10, 2) #即 L=[1, 3, 5, 7, 9]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	list的方法
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.append(var) #追加元素
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.insert(index,var)
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.pop(var) #返回最后一个元素，并从list中删除之
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.remove(var) #删除第一次出现的该元素
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.count(var) #该元素在列表中出现的个数
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.index(var) #该元素的位置,无则抛异常
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.extend(list) #追加list，即合并list到L上
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.sort() #排序
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L.reverse() #倒序
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	list 操作符:,+,*，关键字del
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	a[1:] #片段操作符，用于子list的提取
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	[1,2]+[3,4] #为[1,2,3,4]。同extend()
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	[2]*4 #为[2,2,2,2]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	del L[1] #删除指定下标的元素
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	del L[1:3] #删除指定下标范围的元素
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	list的复制
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L1 = L #L1为L的别名，用C来说就是指针地址相同，对L1操作即对L操作。函数参数就是这样传递的
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	L1 = L[:] #L1为L的克隆，即另一个拷贝。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	list comprehension
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	[ &lt;expr1&gt; for k in L if &lt;expr2&gt; ]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	2、dictionary： 字典（即C++标准库的map）
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	dict = {‘ob1′:’computer’, ‘ob2′:’mouse’, ‘ob3′:’printer’}
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	每一个元素是pair，包含key、value两部分。key是Integer或string类型，value 是任意类型。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	键是唯一的，字典只认最后一个赋的键值。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	dictionary的方法
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.get(key, 0) #同dict[key]，多了个没有则返回缺省值，0。[]没有则抛异常
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.has_key(key) #有该键返回TRUE，否则FALSE
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.keys() #返回字典键的列表
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.values()
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.items()
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.update(dict2) #增加合并字典
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.popitem() #得到一个pair，并从字典中删除它。已空则抛异常
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.clear() #清空字典，同del dict
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.copy() #拷贝字典
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	D.cmp(dict1,dict2) #比较字典，(优先级为元素个数、键大小、键值大小)
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	#第一个大返回1，小返回-1，一样返回0
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	dictionary的复制
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	dict1 = dict #别名
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	dict2=dict.copy() #克隆，即另一个拷贝。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	3、tuple：元组（即常量数组）
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	tuple = (‘a’, ‘b’, ‘c’, ‘d’, ‘e’)
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	可以用list的 [],:操作符提取元素。就是不能直接修改元素。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	4、string： 字符串（即不能修改的字符list）
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	str = “Hello My friend”
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	字符串是一个整 体。如果你想直接修改字符串的某一部分，是不可能的。但我们能够读出字符串的某一部分。
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	子字符串的提取
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	str[:6]
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	字符串包含 判断操作符：in，not in
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	“He” in str
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	“she” not in str
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	string模块，还提供了很多方法，如
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.find(substring, [start [,end]]) #可指范围查找子串，返回索引值，否则返回-1
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.rfind(substring,[start [,end]]) #反向查找
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.index(substring,[start [,end]]) #同find，只是找不到产生ValueError异常
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.rindex(substring,[start [,end]])#同上反向查找
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.count(substring,[start [,end]]) #返回找到子串的个数
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.lowercase()
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.capitalize() #首字母大写
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.lower() #转小写
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.upper() #转大写
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.swapcase() #大小写互换
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.split(str, ‘ ‘) #将string转list，以空格切分
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	S.join(list, ‘ ‘) #将list转string，以空格连接
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	处理字符串的内置函数
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	len(str) #串长度
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	cmp(“my friend”, str) #字符串比较。第一个大，返回1
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	max(‘abcxyz’) #寻找字符串中最大的字符
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	min(‘abcxyz’) #寻找字符串中最小的字符
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	string的转换
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	oat(str) #变成浮点数，float(“1e-1″) 结果为0.1
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	int(str) #变成整型， int(“12″) 结果为12
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	int(str,base) #变成base进制整型数，int(“11″,2) 结果为2
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	long(str) #变成长整型，
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	long(str,base) #变成base进制长整型，
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	字符串的格式化（注意其转义字符，大多如C语言的，略）
</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">
	str_format % (参数列表)</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1430">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] List(列表),tuple(元组)和array的区别(转)" href="http://www.showerlee.com/archives/1430">http://www.showerlee.com/archives/1430</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1430/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Python] 调取MYSQL数据并插入到CSV文件</title>
		<link>http://www.showerlee.com/archives/1425</link>
		<comments>http://www.showerlee.com/archives/1425#comments</comments>
		<pubDate>Fri, 17 Apr 2015 06:35:12 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1425</guid>
		<description><![CDATA[如何利用python脚本将远程数据库查询值,并将该值按照csv中"column A"对应关系整体插入到"col [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	如何利用python脚本将远程数据库查询值,并将该值按照csv中"column A"对应关系整体插入到"column B",最近handle了一个case,联想到python天生对数据处理较shell有明显的优势,最后尝试用脚本搞定这个看起来逻辑很简单,但又不简单的data processing.
</p>
<p>
	Target:
</p>
<p>
	column A 是DB内存储的若干Project name,需要通过查询数据库,获取这些project name在DB对应的Project key的具体值,并插入column A后保存.
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python
# encoding: utf-8

import MySQLdb
import csv
import sys

# Define csv list
Csv_content = []
Csv_content_edited = []

# Define project list
Project_names = []

# Define db list
Db_content = []

# Define the file that needs to be handled.
try:
	file_name = sys.argv[1]
	new_file_name = file_name.split('.')[0] + '_new.' + file_name.split('.')[1]
except IndexError:
	pass

def selectDB():
	# Open db connection
	db = MySQLdb.connect("test.com", "testuser", "testuser", "testdb")

	# Use cursor() fuction to get current db cursor
	cursor = db.cursor()

	Csv_content_edited = readContent(file_name)

	for c in range(1,len(Csv_content_edited)):
		Project_names.append(Csv_content_edited[c][0])

	Project_name_string = ",".join(['"' + p + '"' for p in Project_names])

	# SQL "SELECT" statement
	sql = 'select pname,pkey from project where pname in (%s)' %Project_name_string
	
	try:
		# Execute SQL
		cursor.execute(sql)
		# Obtain all the record list
		results = cursor.fetchall()

		for row in results:
			#lower_user_name = row[3]
			Db_content.append(row)

		return Db_content
	except:
		print "Error: unable to fecth data"

	# Close connection
	db.close()


def readContent(file_name):
	# Read the csv file,then put it into list.
	with open(file_name, 'r') as csvfile:
		csv_reader = csv.reader(csvfile, delimiter=',')
		for row in csv_reader:			 
			if row[0]:
				Csv_content.append(row)
	return Csv_content


def insert_col():
	Csv_content_edited = readContent(file_name)
	# Insert null value to each components of "Csv_content_edited" afterward.
	for i in range(0,len(Csv_content_edited)):
		Csv_content_edited[i].insert(1,'')

	# Define the second inserted column title.
	Csv_content_edited[0][1] = "Pkey"
	# Grab the users data from db.
	Db_content = selectDB()
	# print Db_content
	
	for d in range(0,len(Db_content)):
		Pkey = Db_content[d][1]
		Pname = Db_content[d][0]
		for c in range(0,len(Csv_content_edited)):  
			if Csv_content_edited[c][0] == Pname:
				Csv_content_edited[c][1] = Pkey
	# print Csv_content_edited

	pname_list = []
	Csv_content_edited_new = []
	
	for c in range(0,len(Csv_content_edited)):
		if not Csv_content_edited[c][0] in pname_list:
			pname_list.append(Csv_content_edited[c][0])
			Csv_content_edited_new.append(Csv_content_edited[c])
	# print Csv_content_edited_new
	
	return Csv_content_edited_new



# Write the csv file. 
def writeContent():
	with open(new_file_name,'wb') as csvfile:
		csv_writer = csv.writer(csvfile)
		csv_writer.writerows(insert_col())


# Execute the finnal function.	
if __name__ == '__main__':
	try:
		writeContent()
	except (IOError,NameError,IndexError):
		print "Please type the correct file name. e.g: '" + sys.argv[0] + " testfile.csv'"
	else:
		print 'The result file is: %s' %new_file_name

</pre>
<p>Result:</p>
<p>
	
</p>
<p>
	Before the change:
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-2.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-2.png" alt="QQ20150417-2" width="133" height="93" class="alignnone size-full wp-image-1427" /></a>
</p>
<p>
	after the change:
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-1.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-1.png" alt="QQ20150417-1" width="132" height="90" class="alignnone size-full wp-image-1426" /></a>
</p>
<p>
	
</p>
<p>
	</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1425">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] 调取MYSQL数据并插入到CSV文件" href="http://www.showerlee.com/archives/1425">http://www.showerlee.com/archives/1425</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1425/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Python] 将csv文件中单个列的多个value拆分成多个列的单个value</title>
		<link>http://www.showerlee.com/archives/1418</link>
		<comments>http://www.showerlee.com/archives/1418#comments</comments>
		<pubDate>Mon, 23 Mar 2015 08:59:38 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1418</guid>
		<description><![CDATA[&#160; &#160; 很久没有更新博客了,最近handle了一个项目需要处理大量csv文件,需求是将cs [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	&nbsp; &nbsp; 很久没有更新博客了,最近handle了一个项目需要处理大量csv文件,需求是将csv文件中某单个列的多个values(该多个vaules以回车分隔)拆分成多个相同列的单个value,由于python在处理脚本先天比shell更有优势,这里把自己的最近学到python知识加以应用,编写了一个脚本,供大家参考.
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python

import csv
import sys

# Define the duality list
Csv_content_edited = []

# Define the file that needs to be handled.
try:
	file_name = sys.argv[1]
	new_file_name = file_name.split('.')[0] + '_new.' + file_name.split('.')[1]
except IndexError:
	pass

# Define the collumns that need to be dealt with.
Field = ['Affects Version/s','Fix Version/s','Component/s']

"""
 Search the index numbers of each components of "Field" list in the first row of csv file,
 return the dic["field value":"the index of first_row"] 
"""
def search_field_index(field, first_row):
	fields_dic = {}
	for x in first_row:
		if x in field:
			fields_dic[x] = first_row.index(x)
	return fields_dic

'''
  Find the maximum value number of each "Field" components in "Csv_content_edited" list,
  then insert the actual number of the columns after each "Field" columns.
'''
def insert_max_col(field_index,Field_val):
	# Define the list stored maximum number of the value of the field
	index_len = []
	# Define the list stored the value of the field
	index_val = []
	# Recursive the row from 2 ~ max of the csv field
	for r in range(1,len(Csv_content_edited)):
		# Deal with special string
		c = repr(Csv_content_edited[r][field_index]).split("\\r")
		index_len.append(len(c))
		index_val.append(c)
	# The maximum component of the "index_len" list
	max_index_len = max(index_len)

	# Clear " " and "'" string which are in the head or tail of each "index_val" components.
	for iv in range(0,len(index_val)):
		for _iv in range(0,len(index_val[iv])):
			index_val[iv][_iv] = index_val[iv][_iv].strip(' \'')

	# insert null value collumn after the field from "Field" list to the "Csv_content_edited" list
	for i in range(0,len(Csv_content_edited)):
		for m in range(0,max_index_len - 1):
			Csv_content_edited[i].insert(field_index + m + 1,'')

	# Update the first row of "Csv_content_edited" list to the field components from "Field" list
	for i1 in range(field_index,field_index + max_index_len):
		Csv_content_edited[0][i1] = Field_val

	# Update the rest rows of "Csv_content_edited" list to the field components from "index_val" list
	for i in range(1,len(Csv_content_edited)):
		for i2 in range(field_index,field_index + max_index_len):
			try:
				Csv_content_edited[i][i2] = index_val[i-1][i2 - field_index]
			except IndexError as s:
				pass

	# return Csv_content_edited[3],index_val,max_index_len
	# return len(Csv_content_edited),len(index_val)
	# print max_index_len
	# print index_val[2][0]
	# return len(index_val[2])


# Read and deal with the csv file. 
def readContent(file_name):
	# Read the csv file,then put it into list.
	with open(file_name, 'r') as csvfile:
		csv_reader = csv.reader(csvfile, delimiter=',')
		for row in csv_reader:			 
			if row[0] == 'Key':	
				first_row = []		
				first_row = row
				# insert first row of csv to the list
				Csv_content_edited.append(first_row)
			else:
				# insert rest row of csv to the list
				Csv_content_edited.append(row)
		else:
			# Obtain all current "Field" index in "Csv_content_edited" list
			fields_index = search_field_index(Field,first_row)
			# Obtain the index of "Affects_Version" in in "Csv_content_edited" list
			Affects_Version_index = fields_index[Field[0]]
			# insert the matching value
			insert_max_col(Affects_Version_index,Field[0])

			# Obtain all current "Field" index in "Csv_content_edited" list
			first_row_updated = Csv_content_edited[0]
			fields_index = search_field_index(Field,first_row_updated)		
			# Obtain the index of "Affects_Version" in in "Csv_content_edited" list
			Fix_Version_index = fields_index[Field[1]]
			# insert the matching value
			insert_max_col(Fix_Version_index,Field[1])

			# Obtain all current "Field" index in "Csv_content_edited" list
			first_row_updated = Csv_content_edited[0]
			fields_index = search_field_index(Field,first_row_updated)
			# Obtain the index of "Affects_Version" in in "Csv_content_edited" list
			Fix_Version_index = fields_index[Field[2]]
			# insert the matching value
			insert_max_col(Fix_Version_index,Field[2])
	# Obtain the final edited list.
	return Csv_content_edited

# Write the csv file. 
def writeContent():
	with open(new_file_name,'wb') as csvfile:
		csv_writer = csv.writer(csvfile)
		csv_writer.writerows(readContent(file_name))

# Execute the finnal function.	
if __name__ == '__main__':
	try:
		writeContent()
	except (IOError,NameError,IndexError):
		print "Please type the correct file name. e.g: '" + sys.argv[0] + " testfile.csv'"
	else:
		print 'The result file is: %s' %new_file_name



</pre>
<p>
	
</p>
<p>
	处理前的效果
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/03/QQ20150323-1.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/03/QQ20150323-1.png" alt="QQ20150323-1" width="618" height="201" class="alignnone size-full wp-image-1419" /></a>
</p>
<p>
	
</p>
<p>
	处理后的效果
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/03/QQ20150323-2.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/03/QQ20150323-2.png" alt="QQ20150323-2" width="527" height="185" class="alignnone size-full wp-image-1420" /></a>
</p>
<p>
	
</p>
<p>
	如有雷同,纯属扯淡...</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1418">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] 将csv文件中单个列的多个value拆分成多个列的单个value" href="http://www.showerlee.com/archives/1418">http://www.showerlee.com/archives/1418</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1418/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PYTHON] 核心编程笔记(21.数据库编程)</title>
		<link>http://www.showerlee.com/archives/1060</link>
		<comments>http://www.showerlee.com/archives/1060#comments</comments>
		<pubDate>Sat, 04 Jan 2014 07:56:17 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1060</guid>
		<description><![CDATA[21.1 介绍 21.1.1 持久存储 21.1.2 基本的数据库操作和SQL语言 底层存储 数据库的底层存储 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.1 介绍
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.1.1 持久存储
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.1.2 基本的数据库操作和SQL语言
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	底层存储
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	数据库的底层存储通常使用文件系统,它可以是普通操作系统文件,专用操作系统
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	文件,甚至有可能是磁盘分区
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	用户界面
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	大部分数据库系统会提供一个命令行工具来执行SQL命令和查询,也有一些使用图
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	形界面
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	数据库
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	关系型数据库管理系统通常都支持多个数据库,如果其基于服务器,这些数据库都
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在同一台服务器上,本例,MYSQL是一种基于服务器的关系数据库管理系统
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	组件
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	你可以将数据库存储想象为一个表格,每行数据都有一个或多个字段对应数据库
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	的列,每个表每个列及其数据类型的集合构成数据库结构的定义,数据库能够被创
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	建,也可以被删除
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	SQL
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	数据库命令和查询操作需要通过SQL语句来执行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	创建数据库和赋予权限
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	CREATE DATABASE test;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	GRANT ALL ON test.* to user(s);
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	选择要使用的数据库
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	USE test;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	删除数据库
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	DROP DATABASE test;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	创建表
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	CREATE TABLE users(login VARCHAR(8),uid INT,prid INT);
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	删除表
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	DROP TABLE users;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	插入行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	INSERT INTO users VALUES('leanna',311,1)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	更新行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	UPDATE users SET prid=4 WHERE prid=2;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	UPDATE users SET prid=1 WHERE uid=311;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	删除行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	DELETE FROM users WHERE prid=%d;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	DELETE FROM users;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.1.3 数据库和Python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2 Python数据库应用程序
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	程序员接口(DB-API)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2.1 模块属性
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	数据属性
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	属性名描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	apilevelDB-API模块兼容的DB-API版本号
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	threadsafety线程安全级别
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	parmstyle该模块支持的SQL语句参数风格
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	connect()连接函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	MySQLdb.connect(host='dbserv',db='inv',user='smith')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2.2 连接对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	要与数据库进行通信,必须先和数据库建立连接,连接对象处理命令如何送往服务
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	器,以及如何从服务器接收数据等基础功能,连接成功后就能向数据库服务器发送
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	请求,得到响应
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	连接对象方法
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	close()关闭数据库连接
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	commit()提交当前事务
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	rollback()取消当前事务
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	cursor()使用这个连接创建并返回一个游标或类游标的对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	errorhandler(cxn, cur,errcls,errval)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2.3 游标对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	当你建立连接之后,就可以与数据库进行交互,一个游标允许用户执行数据库命令
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	和得到查询结果,一个Python DB-API游标对象总是扮演游标角色,无论数据库是
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	否真正支持游标,从这一点讲,数据库接口程序必须实现游标对象,只有这样才能
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	保证无论使用何种后端数据库你的代码都不需要做任何改变
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2.4 类型对象和构造器
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2.5 关系数据库
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.2.6 数据库和Python:接口程序
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	MySQL
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# api-get install python-mysql* -y
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; import MySQLdb &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn = MySQLdb.connect(user='root',passwd='123456')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.query('DROP DATABASE test') &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.query('CREATE DATABASE test')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.query("GRANT ALL ON test.* to 'test'@localhost")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.commit()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	以上代码我们没有使用cursor对象,某些接口程序拥有连接对象,这些连接对象拥
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	有query()方法,可以执行SQL查询,我们不建议使用这种方法
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	下面我们使用游标对象(cursors)和他们的execute()方法,下一个交互集演示了
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	创建表
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn = MySQLdb.connect(user='root',passwd='123456',db='test')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur = cxn.cursor()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute('CREATE TABLE users(login VARCHAR(8), uid INT)')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("INSERT INTO users VALUES('john',7000)")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("INSERT INTO users VALUES('john',7001)")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("INSERT INTO users VALUES('jane',7001)")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("INSERT INTO users VALUES('bob',7200)")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("SELECT * FROM users WHERE login LIKE 'j%'")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	3L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; for data in cur.fetchall():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	... &nbsp; &nbsp; print '%s\t%s' % data
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	...
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	john &nbsp; &nbsp;7000
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	john &nbsp; &nbsp;7001
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	jane &nbsp; &nbsp;7001
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	最后一个特性是更新表,包括更新或删除数据
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("UPDATE users SET uid=7100 WHERE uid=7001")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("SELECT * FROM users")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	4L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; for data in cur.fetchall():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	... &nbsp; &nbsp; print '%s\t%s' % data &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	...
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	john &nbsp; &nbsp;7000
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	john &nbsp; &nbsp;7100
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	jane &nbsp; &nbsp;7100
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	bob &nbsp; &nbsp; 7200
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("UPDATE users SET uid=7100 WHERE uid= 7000")
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute("SELECT * FROM users") &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	4L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; for data in cur.fetchall(): &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	... &nbsp; &nbsp; print '%s\t%s' % data &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	...
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	john &nbsp; &nbsp;7100
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	john &nbsp; &nbsp;7100
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	jane &nbsp; &nbsp;7100
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	bob &nbsp; &nbsp; 7200
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute('DELETE FROM users WHERE login="bob"')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.execute('DROP TABLE users')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0L
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cur.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.commit()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; cxn.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.3 对象-关系管理器(ORMs)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.3.1 考虑对象,而不是SQL
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.3.2 Python和ORM
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.3.4 总结
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	21.4 相关模块</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1060">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[PYTHON] 核心编程笔记(21.数据库编程)" href="http://www.showerlee.com/archives/1060">http://www.showerlee.com/archives/1060</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1060/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PYTHON] 核心编程笔记(20.Web编程)</title>
		<link>http://www.showerlee.com/archives/1057</link>
		<comments>http://www.showerlee.com/archives/1057#comments</comments>
		<pubDate>Sat, 04 Jan 2014 06:39:40 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1057</guid>
		<description><![CDATA[20.1 介绍 20.1.1 Web应用:客户端/服务器计算 20.1.2 因特网 20.2 使用Python [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.1 介绍
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.1.1 Web应用:客户端/服务器计算
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.1.2 因特网
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.2 使用Python进行Web应用:创建一个简单的Web客户端
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.2.1 统一资源定位符
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.2.2 urlparse模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urlparse(urlstr, defProtSch=None, allowFrag=None)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urlunparse(urltup)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urlparse.urljoin()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urljoin(baseurl, newurl,allowFrag=None)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.2.3 urllib模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urllib.urlopen()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urlopen(urlstr, postQueryData=None)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urllib.urlretrieve()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urlretrieve(urlstr, localfile=None, downloadStatusHook=None)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urllib.quote() and urllib,quote_plus()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urllib函数描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	urlopen(urlstr,postQurey-Data=None)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.2.4 urllib2 模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	我们可以建立一个基础认证处理器(urllib2.HTTPBasicAuthHandler),同时在基
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	本URL或域上注册一个登陆密码,这就意味着我们在Web站点上定义了个安全区域,
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	一旦完成这些,你可以安装URL打开器,通过这个处理器打开所有的URL
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	另一个可选办法就是当浏览器提示的时候,输入用户名和密码,这样就发送了一个
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	带有适当用户请求的认证头
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi urlopenAuth.py(问题)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import urllib2
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	LOGIN = 'wesley'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	PASSWD = "you'llNeverGuess"
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	URL = 'http://localhost'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def handler_version(url):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;from urlparse import urlparse as up
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;hdlr = urllib2.HTTPBasicAuthHandler()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;hdlr.add_password('Archives', up(url)[1], LOGIN, PASSWD)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;opener = urllib2.build_opener(hdlr)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;urllib2.install_opener(opener)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;return url
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def request_version(url):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;from base64 import encodestring
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;req = urllib2.Request(url)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;b64str = encodestring('%s:%s' % (LOGIN, PASSWD))[:-1]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;req.add_header("Authorization", "Basic %s" % b64str)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;return req
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	for funcType in ('handler', 'request'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print '*** Using %s:' % funcType.upper()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;url = eval('%s_version')(URL)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;f = urllib2.urlopen(url)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print f.readline()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;f.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.3 高级Web客户端
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Web浏览器是基本的Web客户端,主要用来在Web上查询或者下载文件
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	高级Web客户端的一个例子就是网络爬虫,这些程序可以基于不同目的在因特网上
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	探索和下载页面:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.为Google和Yahho这类大型搜索引擎建立索引
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2.脱机浏览一将文档下载到本地,重新设定超链接,为本地浏览器创建镜像
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	3.下载并保存历史记录或框架
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	4.Web页的缓存,节省再次访问Web站点的下载时间
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.4 CGI:帮助Web服务器处理客户端数据
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.4.1 CGI介绍
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	CGI代表了在一个web服务器和能够处理用户表单,生成并返回动态HTML页的应用
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	程序间的交互
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.4.2 CGI应用程序
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	当一个CGI脚本开始执行时,它需要检索用户-支持表单,但这些数据必须要从web
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	客户端才可以获得,而不是从服务器或者硬盘上获得,所有的交互都将发生在Web
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	客户端,Web服务器端和CGI应用程序间
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.4.2 cgi模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.5 建立CGI应用程序
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.5.1 建立Web服务器
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	为了可以用Python进行CGI开发,首先需要安装一个Web服务器,将其配置成可以处
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	理Python CGI请求的模式,然后让你的Web服务器访问CGI脚本
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.可以下载安装apache及其Python CGI插件模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2.利用Python自带的web服务器
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python -m CGIHTTPServer
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Serving HTTP on 0.0.0.0 port 8000 ...
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.5.2 建立表单页
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.5.3 生成结果页
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.登陆一个非root账户,在当前目录下建立一个端口号为8000的web服务器
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd ~
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# pwd
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	/home/python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# mkdir web
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd web
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python -m CGIHTTPServer
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2.在启动这个服务器的目录下建立一个cgi-bin,并将Python CGI脚本放到该目录
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# mkdir cgi-bin
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd cgi-bin
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi friends1.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import cgi
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	reshtml = '''Content-Type: text/html\n
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Friends CGI Demo (dynamic screen)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;Friends list for: &lt;I&gt;%s&lt;/I&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Your name is: &lt;B&gt;%s&lt;/B&gt;&lt;P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	You have &lt;B&gt;%s&lt;/B&gt; friends.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	form = cgi.FieldStorage()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	who = form['person'].value
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	howmany = form['howmany'].value
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print reshtml % (who, who, howmany)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	3.创建web表单:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这个HTML文件展示给用户一个空文档,含有用户名,和一系列可供用户选择的单选
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	按钮
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd ..
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# pwd
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	/home/python/web
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi friends.htm
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;HTML&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;TITLE&gt;CGI Demo(static screen)&lt;/TITLE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;Friends list for: &lt;I&gt;NEW USER&lt;/I&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;FORM ACTION='cgi-bin/friends1.py'&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;B&gt;Enter your Name:&lt;/B&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE='text' NAME=person VALUE='NEW USER' SIZE=15&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;B&gt;How many friends do you have?&lt;/B&gt;&lt;/P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE='radio' NAME=howmany VALUE='0' CHECKED&gt; 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE='radio' NAME=howmany VALUE='10'&gt; 10
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE='radio' NAME=howmany VALUE='25'&gt; 25
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE='radio' NAME=howmany VALUE='50'&gt; 50
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE='radio' NAME=howmany VALUE='100'&gt; 100
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;INPUT TYPE=submit&gt;&lt;/P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/FORM&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/HTML&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	表单的变量是FieldStorage的实例,包含person和howmany 字段值,我们把值存入
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Python的who和howmany变量,变量reshtml包含需要返回的HTML文本正文,还有一
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	些动态填好的字段,这些数据都是从表单中读入的
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	4.浏览器访问页面
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
<p><a href="http://localhost:8000/friends.htm" rel="nofollow">http://localhost:8000/friends.htm</a></p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.5.4 生成表单和结果页面
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	将friends.html和friends1.py合并成friends2.py,得到的脚本可以同时显示表
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	单和动态生成的HTML结果页面,同时可以巧妙的知道应该输出哪个页面
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi friends2.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	$Id: friends2.py,v 1.1 2000/12/31 01:32:45 wesc Exp $
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	CGI demo
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import cgi
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	header = 'Content-Type: text/html\n\n'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	formhtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Friends CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;Friends list for: &lt;I&gt;NEW USER&lt;/I&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;FORM ACTION="/cgi-bin/friends2.py"&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;B&gt;Enter your Name:&lt;/B&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE=hidden NAME=action VALUE=edit&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE=text NAME=person VALUE="" SIZE=15&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;B&gt;How many friends do you have?&lt;/B&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	%s
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;INPUT TYPE=submit&gt;&lt;/FORM&gt;&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	friendradio = '&lt;INPUT TYPE=radio NAME=howmany VALUE="%s" %s&gt; %s\n'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def showForm():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;friends = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in [0, 10, 25, 50, 100]:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;checked = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if i == 0:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;checked = 'CHECKED'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;friends = friends + friendradio % (str(i), checked, str(i))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print header + formhtml % (friends)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	reshtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Friends CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;Friends list for: &lt;I&gt;%s&lt;/I&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Your name is: &lt;B&gt;%s&lt;/B&gt;&lt;P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	You have &lt;B&gt;%s&lt;/B&gt; friends.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def doResults(who, howmany):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# substitute in real name and number of friends and return
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print header + reshtml % (who, who, howmany)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# process() does all the work
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def process():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# initialize Data class object
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;form = cgi.FieldStorage()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# get user name
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if form.has_key('person'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;who = form['person'].value
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;who = 'NEW USER'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# get name and number of friends
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if form.has_key('howmany'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;howmany = form['howmany'].value
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;howmany = 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# if editing, show results
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if form.has_key('action'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;doResults(who, howmany)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# otherwise, show form
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;showForm()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# invoke if called directly
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;process()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.5.5 全面交互的web站点
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	我们最后一个例子将会完成这个循环
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	用户在表单页中输入他/她的信息,然后我们处理这些数据,并输出一个结果页面
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	现在我们将会在结果页面上加个链接允许返回到表单页面,但是我们返回的是含
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	有用户输入信息的页面而不是一个空白页面,我们页面上加上了一些错误处理程
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	序,来展示它是如何实现的
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,通过加上返回输入信息的表单页面连接,我们实现了整个循环,并加上一些错
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	误验证,在用户没有选择任何单选按钮时,通知用户
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi friends3.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	$Id: friends3.py,v 1.1 2000/12/31 01:32:45 wesc Exp $
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Friends CGI demo
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import cgi
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from urllib import quote_plus
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from string import capwords
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#from sys import stderr
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#s = stderr.write
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	header = 'Content-Type: text/html\n\n'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	url = 'http://192.168.102.88:8000/cgi-bin/friends3.py'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	errhtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Friends CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;ERROR&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;B&gt;%s&lt;/B&gt;&lt;P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;FORM&gt;&lt;INPUT TYPE=button VALUE=Back ONCLICK="window.history.back
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	()"&gt;&lt;/FORM&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# showError() --&gt; None
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def showError(error_str):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'showError() -- display error message'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print header + errhtml % (error_str)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	friendradio = '&lt;INPUT TYPE=radio NAME=howmany VALUE="%s" %s&gt; %s\n'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	formhtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Friends CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;Friends list for: &lt;I&gt;%s&lt;/I&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;FORM ACTION="%s"&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;B&gt;Your Name:&lt;/B&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE=hidden NAME=action VALUE=edit&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE=text NAME=person VALUE="%s" SIZE=15&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;B&gt;How many friends do you have?&lt;/B&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	%s
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;INPUT TYPE=submit&gt;&lt;/FORM&gt;&lt;/body&gt;&lt;/html&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# showForm() --&gt; None
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def showForm(who, howmany):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'showForm() -- presents blank or data-filled form for new input'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;friends = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in [0, 10, 25, 50, 100]:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;checked = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if str(i) == howmany:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;checked = 'CHECKED'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;friends = friends + friendradio % (str(i), checked, str(i))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print header + formhtml % (who, url, who, friends)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	reshtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Friends CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;Friends list for: &lt;I&gt;%s&lt;/I&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Your name is: &lt;B&gt;%s&lt;/B&gt;&lt;P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	You have &lt;B&gt;%s&lt;/B&gt; friends.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;Click &lt;a href="%s"&gt;here&lt;/a&gt; to edit your data again.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# doResults() --&gt; None
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def doResults(who, howmany):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'doResults() -- displays results with given form data'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# substitute in real name and number of friends and return
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;newurl = url + '?action=reedit&amp;person=%s&amp;howmany=%s' %
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(quote_plus(who), howmany)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print header + reshtml % (who, who, howmany, newurl)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# process() --&gt; None
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def process():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'process() does all the work: &nbsp;grabs user data and determines
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	routine to call'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;error = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# initialize Data class object
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;form = cgi.FieldStorage()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;#s('name: '+str(form.name)+'\n')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;#s('keys: '+str(form.keys())+'\n')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;#for i in form.keys():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#s('item: '+str(form[i].name)+' has a value of '+str(form
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	[i].value)+' and is a ' + form[i].__class__.__name__ + '\n')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# get user name
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if form.has_key('person'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;who = capwords(form['person'].value)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;who = 'NEW USER'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# get name and number of friends
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if form.has_key('howmany'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;howmany = form['howmany'].value
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.has_key('action') and form['action'].value == 'edit':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error = 'Please select the number of friends you have.'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;howmany = 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# no errors, either display form or present results
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if not error:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;# if editing the first time, show results
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.has_key('action') and form['action'].value !=
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'reedit':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;doResults(who, howmany)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;# otherwise, show form
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showForm(who, howmany)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# send error message back if error situation
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;showError(error)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# invoke if called directly
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;process()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.6 在CGI中使用Unide编码
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,简单Unicode CGI示例(uniCGI.py)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这个脚本输出到你web浏览器端的是Unicode字符串
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi uniCGI.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	CODEC = 'UTF-8'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	UNICODE_HELLO = u'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Hello!
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	\u00A1Hola!
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	\u4F60\u597D!
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	\u3053\u3093\u306B\u3061\u306F!
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print 'Content-Type: text/html; charset=%s\r' % CODEC
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print '\r'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print '&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Unicode CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print '&lt;BODY&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print UNICODE_HELLO.encode(CODEC)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print '&lt;/BODY&gt;&lt;/HTML&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.7 高级CGI
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.7.1 Mulitipart 表单提交和文件上传
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.7.2 多值字段
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.7.3 cookie
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.7.4 使用高级CGI
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,这个脚本有一个处理所有事情的主函数,AdvCGI,它有方法显示表单,错误或结
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	果页面,同事也可以从客户端(Web浏览器)读写cookie
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi advcgi.py(问题)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from cgi import FieldStorage
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from os import environ
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from cStringIO import StringIO
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from urllib import quote, unquote
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from string import capwords, strip, split, join
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	class AdvCGI:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;header = 'Content-Type: text/html\n\n'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;url = '/py/advcgi.py'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;formhtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Advanced CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H2&gt;Advanced CGI Demo Form&lt;/H2&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;FORM METHOD=post ACTION="%s" ENCTYPE="multipart/form-data"&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;My Cookie Setting&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;LI&gt; &lt;CODE&gt;&lt;B&gt;CPPuser = %s&lt;/B&gt;&lt;/CODE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;Enter cookie value&lt;BR&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT NAME=cookie value="%s"&gt; (&lt;I&gt;optional&lt;/I&gt;)&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;Enter your name&lt;BR&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT NAME=person VALUE="%s"&gt; (&lt;I&gt;required&lt;/I&gt;)&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;What languages can you program in?
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(&lt;I&gt;at least one required&lt;/I&gt;)&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	%s
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;Enter file to upload&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;INPUT TYPE=file NAME=upfile VALUE="%s" SIZE=45&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;P&gt;&lt;INPUT TYPE=submit&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/FORM&gt;&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;langSet = ('Python', 'PERL', 'Java', 'C++', 'PHP',
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'C', 'JavaScript')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;langItem = \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'&lt;INPUT TYPE=checkbox NAME=lang VALUE="%s"%s&gt; %s\n'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def getCPPCookies(self): &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# reads cookies from
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	client
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if environ.has_key('HTTP_COOKIE'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for eachCookie in map(strip, \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;split(environ['HTTP_COOKIE'], ';')):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if len(eachCookie) &gt; 6 and \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eachCookie[:3] == 'CPP':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tag = eachCookie[3:7]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies[tag] = \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eval(unquote(eachCookie[8:]))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;except (NameError, SyntaxError):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies[tag] = \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unquote(eachCookie[8:])
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies['info'] = self.cookies['user'] = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if self.cookies['info'] != '':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.who, langStr, self.fn = \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;split(self.cookies['info'], ':')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.langs = split(langStr, ',')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.who = self.fn = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.langs = ['Python']
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def showForm(self): &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# show fill-out form
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.getCPPCookies()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;langStr = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;for eachLang in AdvCGI.langSet:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if eachLang in self.langs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;langStr = langStr + AdvCGI.langItem % \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(eachLang, ' CHECKED', eachLang)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;langStr = langStr + AdvCGI.langItem % \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(eachLang, '', eachLang)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if not self.cookies.has_key('user') or \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies['user'] == '':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cookieStatus = '&lt;I&gt;(cookie has not been set yet)&lt;/I&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;userCook = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;userCook = cookieStatus = self.cookies['user']
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print AdvCGI.header + AdvCGI.formhtml % (AdvCGI.url,
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cookieStatus, userCook, self.who, langStr, self.fn)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;errhtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Advanced CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H3&gt;ERROR&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;B&gt;%s&lt;/B&gt;&lt;P&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;FORM&gt;&lt;INPUT TYPE=button VALUE=Back
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	ONCLICK="window.history.back()"&gt;&lt;/FORM&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def showError(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print AdvCGI.header + AdvCGI.errhtml % (self.error)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;reshtml = '''&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Advanced CGI Demo&lt;/TITLE&gt;&lt;/HEAD&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;BODY&gt;&lt;H2&gt;Your Uploaded Data&lt;/H2&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;Your cookie value is: &lt;B&gt;%s&lt;/B&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;Your name is: &lt;B&gt;%s&lt;/B&gt;&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;You can program in the following languages:&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;UL&gt;%s&lt;/UL&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;H3&gt;Your uploaded file...&lt;BR&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Name: &lt;I&gt;%s&lt;/I&gt;&lt;BR&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Contents:&lt;/H3&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;PRE&gt;%s&lt;/PRE&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Click &lt;A HREF="%s"&gt;&lt;B&gt;here&lt;/B&gt;&lt;/A&gt; to return to form.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&lt;/BODY&gt;&lt;/HTML&gt;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def setCPPCookies(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;for eachCookie in self.cookies.keys():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print 'Set-Cookie: CPP%s=%s; path=/' % \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(eachCookie, quote(self.cookies[eachCookie]))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def doResults(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;MAXBYTES = 1024
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;langlist = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;for eachLang in self.langs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;langlist = langlist + '&lt;LI&gt;%s&lt;BR&gt;' % eachLang
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;filedata = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;while len(filedata) &lt; MAXBYTES: &nbsp; &nbsp; &nbsp; &nbsp;# read file chunks
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data = self.fp.readline()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if data == '': break
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filedata = filedata + data
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# truncate if too long
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filedata = filedata + \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'... &lt;B&gt;&lt;I&gt;(file truncated due to size)&lt;/I&gt;&lt;/B&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.fp.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if filedata == '':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filedata = \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'&lt;B&gt;&lt;I&gt;(file upload error or file not given)&lt;/I&gt;&lt;/B&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;filename = self.fn
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if not self.cookies.has_key('user') or \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies['user'] == '':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cookieStatus = '&lt;I&gt;(cookie has not been set yet)&lt;/I&gt;'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;userCook = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;userCook = cookieStatus = self.cookies['user']
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.cookies['info'] = join([self.who, \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;join(self.langs, ','), filename], ':')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.setCPPCookies()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print AdvCGI.header + AdvCGI.reshtml % \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(cookieStatus, self.who, langlist,
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filename, filedata, AdvCGI.url)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def go(self): &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# determine which page to return
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.cookies = {}
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.error = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;form = FieldStorage()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.keys() == []:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.showForm()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.has_key('person'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.who = capwords(strip(form['person'].value))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if self.who == '':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.error = 'Your name is required. (blank)'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.error = 'Your name is required. (missing)'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.has_key('cookie'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies['user'] = unquote(strip( \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;form['cookie'].value))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.cookies['user'] = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.langs = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.has_key('lang'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;langdata = form['lang']
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if type(langdata) == type([]):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for eachLang in langdata:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.langs.append(eachLang.value)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.langs.append(langdata.value)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.error = 'At least one language required.'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if form.has_key('upfile'):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;upfile = form["upfile"]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.fn = upfile.filename or ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if upfile.file:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.fp = upfile.file
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.fp = StringIO('(no data)')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.fp = StringIO('(no file)')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.fn = ''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;if not self.error:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.doResults()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;else:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.showError()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;page = AdvCGI()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;page.go()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.8 Web(HTTP)服务器
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.8.1 用Python建立Web服务器
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,这个简单的Web服务器可以读取GET请求,获取Web页面并将其返回给客户端,它
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	通过使用BaseHTTPServer的BaseHTTPRequestHandler处理器执行do_GET()方法来
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	处理GET请求
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi myhttpd.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from os import curdir, sep
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from BaseHTTPServer import \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;BaseHTTPRequestHandler, HTTPServer
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	class MyHandler(BaseHTTPRequestHandler):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def do_GET(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;try:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f = open(curdir + sep + self.path)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.send_response(200)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.send_header('Content-type',
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'text/html')
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.end_headers()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.wfile.write(f.read())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;except IOError:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.send_error(404,
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	'File Not Found: %s' % self.path)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;try:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;server = HTTPServer(('', 80), MyHandler)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print 'Welcome to the machine...'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	print 'Press ^C once or twice to quit'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;server.serve_forever()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;except KeyboardInterrupt:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print '^C received, shutting down server'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;server.socket.close()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	20.9 相关模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	........
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1057">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[PYTHON] 核心编程笔记(20.Web编程)" href="http://www.showerlee.com/archives/1057">http://www.showerlee.com/archives/1057</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1057/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PYTHON] 核心编程笔记(18.多线程编程)</title>
		<link>http://www.showerlee.com/archives/1055</link>
		<comments>http://www.showerlee.com/archives/1055#comments</comments>
		<pubDate>Tue, 31 Dec 2013 03:20:09 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1055</guid>
		<description><![CDATA[18.1 引言/动机 18.2 线程和进程 18.2.1 什么是进程(重量级进程)? 计算机程序只不过是磁盘中 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.1 引言/动机
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.2 线程和进程
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.2.1 什么是进程(重量级进程)?
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	计算机程序只不过是磁盘中可执行的,二进制(或其他类型)的数据,他们只有在被读取到内存中,被操作系统调用时才开始他们的生命期,进程是程序的一次执行,每个进程都有自己的地址空间,内存,数据栈以及其他记录其运行轨迹的赋值数据,操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间,进程可以通过fork和spawn操作来完成其他任务,其之间用进程间通讯(IPC)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.2.2 什么是线程(轻量级进程)?
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	线程跟进程有些相似,不同的是,所有线程运行在同一个进程中,共享相同运行环境,他们可以想象成是在主进程或"主线程"中并行运行的"迷你进程".
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	一个进程中的各个线程之间共享同一片数据空间,从而更方便的共享数据和相互通讯,线程一般都是并行执行.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.3 Python,线程和全局解释器锁
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.3.1 全局解释器锁(GIL)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Python代码的执行由Python虚拟机(也叫解释器主循环)来控制,对虚拟机的访问由卷曲解释器锁(GIL)来控制,正式这个锁能保证同一时刻只有一个线程在运行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在多线程环境中,Python虚拟机按一下方式执行:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.设置GIL
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2.切换到一个线程去运行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	3.运行:1.执行数量的字节码指令 或2.线程主动让出控制(调用time.sleep(0))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	4.把线程设置为睡眠状态
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	5.解锁GIL
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	6.再次重复以上所有步骤
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.3.2 退出线程
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	当一个线程结束计算,它就退出了,线程可以调用thread.exit()之类的退出函数.或标准的sys.exit()或抛出一个SystemExit异常等,不过你不可以直接杀掉一个线程
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	主线程应该是一个好的管理者,它了解每个线程都做些什么事,线程都需要什么数据和参数,以及在线程结束的时候,他们提供了什么结果,这样主线程就可以把各个线程的结果组成一个有意义的最后结果.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.3.3 在Python中使用线程
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在解释器里判断线程是否可用,只要导入thread模块后未报错即表示线程可用
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt; import thread
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt;&gt;&gt;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.3.4 没有线程支持的情况
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,单线程中运行的循环()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在单线程中顺序执行两个循环,一定要一个循环结束,另一个才能开始,总时间是各个循环运行时间之和
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi onethr.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep,ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop0():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop 0 at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(4)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop 0 done at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop1():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop 1 at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(2)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop 1 done at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'starting at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;loop0()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;loop1()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	输出:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python onethr.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting at: Wed Dec &nbsp;4 07:01:26 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 0 at: Wed Dec &nbsp;4 07:01:26 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 0 done at: Wed Dec &nbsp;4 07:01:30 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 1 at: Wed Dec &nbsp;4 07:01:30 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 1 done at: Wed Dec &nbsp;4 07:01:32 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE at: Wed Dec &nbsp;4 07:01:32 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	假定loop0()和loop1()例做的不是睡眠,而是各自独立,不相关的运算,各自运算结果到最后将汇总成一个最终的结果
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.3.5 Python的threading模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Python提供了thread,threading和Queue等多线程编程模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	注:避免使用thread模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	因为使用thread模块里的属性有可能会与threading出现冲突,threading较thread对线程支持更加完善'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.4 thread模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	thread模块和锁对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	函数描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	thread模块函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start_new_thread(function,
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	args, kwargs=None)产生一个新的进程,在新线程中用指定的参数和可选kwargs来调用这个函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	allocate_lock()分配一个LookType类型的锁对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	exit()让线程退出
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	LockType类型锁对象方法
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	acquire(wait=None)尝试获得锁对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	locked()如果获取了锁对象返回True,否则返回False
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	release()释放锁
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,这儿执行的是和onethr.py中一样的循环,不同的是,这次我们使用的是thread模块提供的简单的多线程机制,两个循环
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi mtsleep1.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import thread
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep,ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop0():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop 0 at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(4)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop 0 done at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop1():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop 1 at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(2)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop 1 done at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'starting at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;thread.start_new_thread(loop0, ())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;thread.start_new_thread(loop1, ())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(6)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__=='__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这个程序的输出与之前的输出大不相同,之前是运行了6,7秒,现在是4秒
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	因为睡眠4秒和2秒的代码现在是并发执行的,这样就使得运行时间被缩短了
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在这里,我们使用了sleep()函数作为我们的同步机制
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python mtsleep1.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting at: Fri Dec 20 23:56:42 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 1 at: Fri Dec 20 23:56:42 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 0 at: Fri Dec 20 23:56:42 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 1 done at: Fri Dec 20 23:56:44 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 0 done at: Fri Dec 20 23:56:46 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE at: Fri Dec 20 23:56:48 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,通过使用锁来完成任务
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这里,使用锁比mtsleep1.py那里在主线程中使用sleep()函数更合理
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi mtsleep2.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import thread
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep,ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loops = [4,2]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop(nloop,nsec,lock):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop', nloop, 'at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(nsec)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop', nloop, 'done at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;lock.release()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'starting at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;locks = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;nloops = range(len(loops))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;lock = thread.allocate_lock()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;lock.acquire()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;locks.append(lock)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;thread.start_new_thread(loop, (i, loops[i], locks[i]))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;while locks[i].locked(): pass
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python mtsleep2.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting at: Sat Dec 21 01:13:06 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 1 at: Sat Dec 21 01:13:06 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 0 at: Sat Dec 21 01:13:06 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 1 done at: Sat Dec 21 01:13:08 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 0 done at: Sat Dec 21 01:13:10 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE at: Sat Dec 21 01:13:10 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在线程结束时,线程要自己去做解锁操作,最后一个循环只是坐在那一直等,直到两个锁都被解锁为止才继续运行,由于我们顺序检查每一个锁,所以我们可能会要长时间地等待运行时间长且放在前面的线程,当这些线程的锁释放后,后面的锁可能早就释放了,结果主线程只能毫不停歇地完成对后面这些锁的检查
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	thread模块只是作为演示,在使用多线程程序应该使用更高级别的模块,如threading等
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.5 threading模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	接下来,我们要介绍的是更高级别的threading模块,他不仅提供了Thread类,还提供了各种非常好用的同步机制
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这里我们不在提到锁原语,而Thread类也有某种同步机制
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	threading模块对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	threading模块对象描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Thread标识一个线程的执行对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	RLock锁原语对象(跟thread模块里的锁对象相同)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Condition条件变量对象能让一个线程停下来,等待其他线程满足了某个条件,如,状态的改变或值的改变
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Event通用的条件变量,多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Semaphore为等待锁的线程提供一个类似"等候室"的结构
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	BoundedSemaphore与Semaphpre类似,只是它不允许超过初始值
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Timer与Thread相似,只是,它要等待一段时间后才开始运行.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	核心提示:守护线程
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求,它就在那等着,如果你设定一个线程为守护线程,就标识你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	如果你的主线程要退出的时候,不用等待那些子线程完成,那就设定这些线程的daemon属性
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	如果你想要等待子线程完成再退出,那就什么都不用做
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	整个Python会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.5.1 Thread类
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	用Thread类,你可以用多种方法来创建线程:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.创建一个Thread的实例,传给它一个函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2.创建一个Thread的实例,传给它一个可调用的类对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	3.从Thread派生出一个子类,创建一个这个子类的实例
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	函数描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start()开始线程的执行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	run()定义线程的功能的函数(一般会北子类重写)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	join(timeout=None)程序挂起,直到线程结束:如果给了timeout,则最多阻塞timeout秒
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	getName()返回线程的名字
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	setName(name)设置线程的名字
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	isAlive()布尔标志,标识这个线程是否还在运行中
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	isDaemon()返回线程的daemon标志
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	setDaemon(daemonic)把线程的daemon标志设为daemonic
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	创建一个Thread的实例,传给它一个函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,使用thread模块,threading模块的Thread类有一个join()函数,允许主线程等待线程的结束
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi mtsleep3.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import threading
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep,ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loops = [4,2]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop(nloop,nsec):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop', nloop, 'at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import threading
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep,ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loops = [4,2]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop(nloop,nsec):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop', nloop, 'at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(nsec)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop',nloop, 'done at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'starting at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;threads = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;nloops = range(len(loops))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;t = threading.Thread(target=loop,args=(i,loops[i]))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads.append(t)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].start()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].join()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python mtsleep3.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting at: Sat Dec 21 12:14:57 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 0 at: Sat Dec 21 12:14:57 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 1 at: Sat Dec 21 12:14:57 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 1 done at: Sat Dec 21 12:14:59 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 0 done at: Sat Dec 21 12:15:01 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE at: Sat Dec 21 12:15:01 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	所有线程都创建了之后,再一起调用start()函数启动,而不是创建一个启动一个,而且不用再管理一堆锁,只要简单对每个线程调用join()函数就可以
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	创建一个Thread实例,传给它一个可调用的类对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	此例中,我们传了一个可调用的类的实例,而不是仅传一个函数,相对mtsleep3.py中的方法来说,这样做更具面向对象的概念
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi mtsleep4.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import threading
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep,ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loops = [4,2]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	class ThreadFunc(object):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def __init__(self,func,args,name=''):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.name = name
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.func = func
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.args = args
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def __call__(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;apply(self.func, self.args)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop(nloop, nsec):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop', nloop, 'at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(nsec)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop',nloop,'done at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'starting at:',ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;threads = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;nloops = range(len(loops))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;t = threading.Thread(target=ThreadFunc(loop,(i,loops[i]),loop.__name__))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads.append(t)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].start()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].join()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE at:', ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python mtsleep4.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting at: Sat Dec 21 18:51:07 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 0 at: Sat Dec 21 18:51:07 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 1 at: Sat Dec 21 18:51:07 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 1 done at: Sat Dec 21 18:51:09 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 0 done at: Sat Dec 21 18:51:11 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE at: Sat Dec 21 18:51:11 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.5.4 斐波那契,阶乘和累加和
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	从Thread派生出一个子类,创建一个这个子类的实例
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,我们现在要子类化Thread类,而不是创建它的实例
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi mtsleep5.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import threading
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import sleep, time, ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loops = [ 4, 2 ]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	class MyThread(threading.Thread):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;MyThread derives from the threading.Thread baseclass.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;Rather than a callable class, the run() method is
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;automatically invoked when the thread begins execution.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# constructor
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def __init__(self, func, args, name=''):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threading.Thread.__init__(self)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.name = name
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.setFunc(func, args)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def setFunc(self, func, args):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;setFunc() is the method that sets the function
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;to be called as well as its arguments
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.func = func
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.args = args
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def getResult(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;getResult() provides the return value
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;from the function call
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;return self.res
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def run(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;save the return value from the function call
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;into an instance var rather than returning it
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;'''
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;# * 1.6 * self.res = self.func(*self.args)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.res = apply(self.func, self.args)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# loop() is the same as before
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def loop(nloop, nsec):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'start loop', nloop, 'at:', ctime(time())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(nsec)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'loop', nloop, 'done at:', ctime(time())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# variable setup
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'starting threads...'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;threads = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;nloops = range(len(loops))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# allocate (but do not start) threads
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;t = MyThread(loop, (i, loops[i]), loop.__name__)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads.append(t)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# start threads
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].start()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;# wait for all threads to complete
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nloops:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].join()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python mtsleep5.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting threads...
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 0 at: Sat Dec 21 23:44:07 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	start loop 1 at: Sat Dec 21 23:44:07 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 1 done at: Sat Dec 21 23:44:09 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	loop 0 done at: Sat Dec 21 23:44:11 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	为了让mtsleep5.py中,Thread的子类更为通用,我们把子类单独放在一个模块中,加上一个getResult()函数用以返回函数的运行结果
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,myThread子类化Thread
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi myThread.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	import threading
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import time, ctime
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	class MyThread(threading.Thread):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def __init__(self, func, args, name=''):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threading.Thread.__init__(self)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.name = name
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.func = func
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.args = args
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def getResult(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;return self.res
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;def run(self):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print 'starting', self.name, 'at:', \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;self.res = apply(self.func, self.args)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print self.name, 'finished at:', \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;ctime()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例,斐波那契,阶乘和累加和
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在这个多线程程序中,我们会分别在单线程和多线程环境中,运行三个递归函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi mtfacfib.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from myThread import MyThread
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import time, ctime, sleep
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def fib(x):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(0.005)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if x &lt; 2: return 1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;return (fib(x-2) + fib(x-1))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def fac(x):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(0.1)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if x &lt; 2: return 1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;return (x * fac(x-1))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def sum(x):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;sleep(0.1)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;if x &lt; 2: return 1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;return (x + sum(x-1))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	funcs = (fib, fac, sum)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	n = 12
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;nfuncs = range(len(funcs))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print '*** SINGLE THREAD'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print 'starting', funcs[i].__name__, \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;'at:', ctime(time())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print funcs[i](n)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print funcs[i].__name__, 'finished at:', \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;ctime(time())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print '\n*** MULTIPLE THREADS'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;threads = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;t = MyThread(funcs[i], (n,),
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;funcs[i].__name__)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads.append(t)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].start()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].join()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;print threads[i].getResult()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE at:', ctime(time())
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python mtfacfib.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	*** SINGLE THREAD
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting fib at: Sat Dec 21 23:55:31 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	233
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	fib finished at: Sat Dec 21 23:55:34 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting fac at: Sat Dec 21 23:55:34 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	479001600
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	fac finished at: Sat Dec 21 23:55:35 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting sum at: Sat Dec 21 23:55:35 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	78
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	sum finished at: Sat Dec 21 23:55:37 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	*** MULTIPLE THREADS
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting fib at: Sat Dec 21 23:55:37 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting fac at: Sat Dec 21 23:55:37 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting sum at: Sat Dec 21 23:55:37 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	fac finished at: Sat Dec 21 23:55:38 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	sum finished at: Sat Dec 21 23:55:38 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	fib finished at: Sat Dec 21 23:55:39 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	233
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	479001600
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	78
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE at: Sat Dec 21 23:55:39 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.5.5 threading模块中的其他函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	函数描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	activeCount()当前活动的线程对象的数量
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	currentThread()返回当前线程对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	enumerate()返回当前活动线程的列表
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	settrace(func)为所有线程设置一个跟踪函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	setprofile(func) 为所有线程设置一个profile函数
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.5.5 生产者-消费者问题和Queue模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这个实现中使用了Queue对象和随机地生产(和消耗)货物的方式,生产者和消费者相互独立并且并发的运行
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi prodcons.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/usr/bin/env python
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from random import randint
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from time import time, ctime, sleep
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from Queue import Queue
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	from myThread import MyThread
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def writeQ(queue):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'producing object for Q...',
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;queue.put('xxx', 1)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print "size now", queue.qsize()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def readQ(queue):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;val = queue.get(1)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'consumed object from Q... size now', \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;queue.qsize()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def writer(queue, loops):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in range(loops):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;writeQ(queue)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;sleep(randint(1, 3))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def reader(queue, loops):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in range(loops):
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;readQ(queue)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;sleep(randint(2, 5))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	funcs = (writer, reader)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	nfuncs = range(len(funcs))
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	def main():
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;nloops = randint(2, 5)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;q = Queue(32)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;threads = []
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;t = MyThread(funcs[i], (q, nloops), \
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;funcs[i].__name__)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads.append(t)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].start()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;for i in nfuncs:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;threads[i].join()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;print 'all DONE'
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	if __name__ == '__main__':
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;main()
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# python prodcons.py
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-----------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting writer at: Sun Dec 22 00:00:36 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	producing object for Q... size now 1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	starting reader at: Sun Dec 22 00:00:36 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	consumed object from Q... size now 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	producing object for Q... size now 1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	consumed object from Q... size now 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	producing object for Q... size now 1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	consumed object from Q... size now 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	writer finished at: Sun Dec 22 00:00:42 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	reader finished at: Sun Dec 22 00:00:46 2013
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	all DONE
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	本例中,一个要完成多项任务的程序,可以考虑没有任务使用一个线程,这样的程序在设计上相对于单线程做所有事的程序来说,更为清晰
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	18.6 相关模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	模块描述
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	thread基本的,底级别的线程模块
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	threading高级别的线程和同步对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Queue供多线程使用的同步先进先出(FIFO)队列
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	mutex互斥对象
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	SocketServer具有线程控制的TCP和UDP管理</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1055">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[PYTHON] 核心编程笔记(18.多线程编程)" href="http://www.showerlee.com/archives/1055">http://www.showerlee.com/archives/1055</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1055/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
