Python应用与实践-转自(吴秦(Tyler))
1. Python是什么?
1.1. Python语言
1.2. Python哲学
2. Python在工作中的应用
2.1. 实例1:文件批量处理
2.2. 实例2:xml与excel互转
2.3. 总结
3. 为什么选择Python?
3.1. 前途!钱途!
3.2. 开发效率极高
3.3. 总而言之
4. 还有谁在用Python?
4.1. 国外
4.2. 国内
5. 是不是想学习Python了?
入门资料
工具
可能有些标题党,没有针对某些具体的应用与实践。有哪些补充、不足请大家指出。
1. Python是什么?
Life is short, You need python
生命苦短,我用Python
1.1. Python语言
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,具有20多年的发展历史,成熟且稳定。Python具有以下特点(摘自《A Byte of Python》,中译名《简明Python教程》):
l 简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
l 易学:Python极其容易上手,因为Python有极其简单的。
l 免费、开源。
l 高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
l 可移植性:由于它的开源本质,Python已经被移植在几乎所有平台上(经过改动使它能够工作在不同平台上)。
l 解释性:Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。
l 面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。
l 可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。(胶水语言)
l 可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。
l 丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
下面简单介绍下几个关键版本:
l 在1989年圣诞节期间的阿姆斯特丹,吉多为了打发圣诞节的无趣,决心开发一个新的脚本解释编程。之所以选中Python作为编程的名字,是因为他是一个蒙提·派森的飞行马戏团的爱好者。
创始人为吉多·范罗苏姆(Guido van Rossum)
l Python 2.0于2000年10月16日发布,主要是实现了完整的垃圾回收,并且支持Unicode。
l Python 3.0于2008年12月3日发布,此版不完全兼容之前的Python源代码。
目前使用最广泛的版本是2.7,最新稳定版本是Python 3.3.1(2013年4月6日)。Django等库开始支持Python3了,也意味着Python3将成为主流。
1.2. Python哲学
图:Python哲学
用过 Python的人,基本上都知道在交互式解释器中输入 import this 就会显示 Tim Peters 的 The Zen of Python。(摘自:《Python之禅》的翻译和解释,http://goo.gl/1joZU)
The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those! |
翻译和解释
Python之禅 by Tim Peters 优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现) 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁) 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套) 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题) 可读性很重要(优美的代码是可读的) 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上) 不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码) 当存在多种可能,不要尝试去猜测 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法) 虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido ) 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量) 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准) 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召) |
2. Python在工作中的应用
2.1. 实例1:文件批量处理
如对文件进行批量重命名,将文件夹中所有的文件名的”scroll_1”替换为”scroll_00”。
文件批量重命名 |
import os path = 'C:\\Users\\tylerzhu\\Desktop\\icon' for file in os.listdir(path): if os.path.isfile(os.path.join(path,file))==True: newname = file.replace("scroll_1", "scroll_00") os.rename(os.path.join(path,file),os.path.join(path,newname)) print(file) |
2.2. 实例2:xml与excel互转
Excel转xml
Excel,info_fight_monster.xls包含3个sheet,分别表示怪物的基本信息、技能信息、奖励信息。
XML,info_fight_monster.xml包含怪物的所有信息,格式如下:
<monster attack="84" attrib="2" classId="20" define="37" desc=""frameRate="24" icon="cdn/imageres/pets/pet_56_20.png" level="4" luck="0"monsterSID="1024" name="被驯服的小火猴" skill="74" speed="0" strength="447"type="0" url="cdn/flashres/pets/pet_20.swf"> <skill skillLevel="2" skillSID="30048"/> <skill skillLevel="2" skillSID="30034"/> <prize desc="" gameID="0" infoType="27" itemSID="80001" itemType="0"level="小火猴的魔法棒" name="" num="1" plusSID="400001" prizeSID="1"type="1"/> </monster> |
编写脚本将Excel转换为XML格式。
Excel转XML |
#! /usr/bin/env python #coding=utf-8 ''' Created on 2013-3-31 将info_fight_monster.xls转换为XML格式。转换分为以下几步: step1: 读取xml文件,info_fight_monster.xls step2: 解析出怪物基本信息,在base这个sheet里面,并放到一个xml文件中 step3: 解析出怪物的技能信息,并将技能信息插入到对应的xml中 step4:解析出怪物的奖励信息,并插入到对应XML中 step5:保存xml文件 @author: tylerzhu''' from lxml import etree import xlrd3, codecs
attrib = ["monsterSID", "classId", "type", "level", "attrib", # "attack", "skill", "define", "speed", "strength", # "luck", "name", "desc", "icon", "url", "frameRate"];
prize = ["monsterSID", "prizeSID", "type", "infoType", "gameID", "itemType", # "itemSID", "num", "plusSID", "level", "name", "desc", "icon"];
skill = ["monsterSID", "skillSID", "skillLevel"];
info_fight_monster_xml = etree.ElementTree(etree.Element("data"));
def openxls(): excel = xlrd3.open_workbook("xls/info_fight_monster.xls"); base = excel.sheet_by_name("base"); monster = excel.sheet_by_name("skill"); prize = excel.sheet_by_name("prize"); return (base, monster, prize);
def buildMonsterBase(xls): sheet = xls[0]; for row in range(1, sheet.nrows): monsterAttr = {}; for col in range(0, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): monsterAttr[attrib[col]] = sheet.cell(row, col).value; if type(monsterAttr[attrib[col]]) == float: #print(str(round(monsterAttr[attrib[col]]))) monsterAttr[attrib[col]] = str(round(monsterAttr[attrib[col]])); sub = etree.SubElement(info_fight_monster_xml.getroot(), "monster", monsterAttr); sub.tail = "\n" #input()
def buildMonsterSkill(xls): sheet = xls[1]; for row in range(1, sheet.nrows): skillAttr = {}; for col in range(1, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): skillAttr[skill[col]] = sheet.cell(row, col).value; if type(skillAttr[skill[col]]) == float: skillAttr[skill[col]] = str(round(skillAttr[skill[col]])); monsterSID = str(int(sheet.cell(row, 0).value)); monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']"); monster.text = ("\n\t"); sub = etree.SubElement(monster, "skill", skillAttr); sub.tail = "\n\t"
def buildMonsterPrize(xls): sheet = xls[2]; for row in range(1, sheet.nrows): prizeAttr = {}; for col in range(1, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): prizeAttr[prize[col]] = sheet.cell(row, col).value; if type(prizeAttr[prize[col]]) == float: prizeAttr[prize[col]] = str(round(prizeAttr[prize[col]])); monsterSID = str(int(sheet.cell(row, 0).value)); monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']"); monster.text = ("\n\t"); sub = etree.SubElement(monster, "prize", prizeAttr); sub.tail = "\n\t"
def build(): xls = openxls(); buildMonsterBase(xls); buildMonsterSkill(xls); buildMonsterPrize(xls);
#输出合并之后的配置 ouput = codecs.open('output/info_fight_monster.xml', 'w', 'utf-8'); ouput.write(etree.tounicode(info_fight_monster_xml.getroot())) ouput.close();
if __name__ == '__main__': build(); |
是不是很简单!
Xml转Excel
下面的例子将技能书info_fight_book.xml的数据转换为excel格式,例子只包含一个sheet的,如果有多个sheet同样处理即可。
XML转Excel |
#! /usr/bin/env python #encoding=utf-8 ''' Created on 2013-5-6 将技能书info_fight_book。xml转换为excel格式。 例子只包含一个sheet,如果有多个sheet同样处理。 @author: tylerzhu ''' from lxml import etree import xlwt3 as xlwt #写excel标题 #。。。 wb = xlwt.Workbook() ws = wb.add_sheet("技能书")
tree = etree.parse('../xls/info_fight_book.xml') root = tree.getroot() row = 0 col = 0 for item in root: if len(item.attrib) == 0: continue row = row + 1 col = 0 for attr in item.attrib: ws.write(row, col, item.attrib[attr]) col = col + 1
wb.save('../output/技能书.xls') |
2.3. 总结
通过上面例子,发现Python代码有以下特点:
l 第一行是特殊形式的注释:它被称作 组织行 ——源文件的头两个字符是#!,后面跟着一个程序。这行告诉你的Linux/Unix系统当你 执行 你的程序的时候,它应该运行哪个解释器。建议使用这种形式——#!/usr/bin/env python,而不是——#!/usr/bin/python。
l 缩进很重要。Python使用缩进而不是一对花括号来划分语句块。
l 文档字符串,__doc__,没多大用。但是一个好的Python程序,应该要有文档字符串,且一般遵循:“文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。”
l python中引入模块后(import)首先就要执行模块的主块,当然模块中可能全是函数。如果要避免使用模块名称:from 模块名 import 符号名,那麽使用该符号名就不用使用模块名+点号+符号名,但是不推荐,容易造成程序不容易读,而且容易出错(特别是在python简洁而简单的语法的基础上)import... as ...起一个别名
l 模块的__name__属性,相当有用,解决了import的缺点,可以实现如果不是运行的本模块而被调用,不调用主块
l 如果你已经厌烦了java、c++的读写文件,那么python会让你重新喜欢上文件读写,python主张解决问题的方案越少越好,写文件就一个f = file(name, 'w'),f.write(...)读文件也一样,f = file(name),f.read或readline,最后close
l ……
3. 为什么选择Python?
3.1. 前途!钱途!
图:据说几年之前,有公司因为提高跳槽门槛而使用Python(摘自:知乎)
上面那截图只是2玩笑而已:-)。不管怎样,现在Python已经成为最受欢迎的程序设计语言之一,完全不用担心这个了。
TIOBE编程语言排行榜,2007、2011两年被TIOBE编程语言排行榜评为年度语言。
图:TIOBE编程语言(2002~2012 Python索引)
PYPL(Popularity of Language Index)编程语言流行指数,它对各种语言的流行指标进行了二次发掘。在过去的十年里,Python语言获得了最大的增长幅度——十年语言之冠。
图:编程语言流行指数(http://goo.gl/Nku0I)
3.2. 开发效率极高
据说豆瓣开发只用了3个月时间就上线了。开发效率高,有以下几方面原因。
丰富的内置类型及相关操作
l String:字符串放在单引号、双引号、三引号(多行时)中,从0开始索引,支持
n 查:find、index、
n 切片: s[0:2]、s[1:]
n 连接:“abc”+“ef” => “abcdef”、join
n 分割:split
n 格式化: format
n 。。。大小写转换、编码等操作
l list, []:names=[“Dave”, “Mark”, “Ann”],列表从0开始索引,索引元素names[1]。列表可以包括任意类型的对象,可以嵌套。支持增、删、查、分片。
n 增:insert、append
n 删:del、remove、pop
n 查:search
n 切片: names[0:2]、[1:]
n 连接:[1,2,3]+[4,5] => [1,2,3,4,,5]、extend
n 反转:reverse
l tuple, ():address=(“www.python.org”, 80),a = (80,)。元组语法与list相似,意义相当于枚举,可以为空,如果只含有一个元素,需要加逗号以区别于表达式(“one”, )。元组创建之后不可修改,即无法替换、删除、插入,但支持
n 索引:address[0] => www.python.org
n 切片:address[0:] => ('www.python.org', 80)
n 连接:(“www.python.org”,) + (80,) => ('www.python.org', 80)
n host,port=address:host => www.python.org,port => 80
l 字典: dict(), {}:address={"host":"www.python.org", "port":80},支持
n 索引:address[“host”] => “www.python.org”,
n get:address.get("host") => “www.python.org”
n 键:address.keys() => ['host', 'port']
n in:"host" in address =>True
n 删除:del address["host"] => {'port': 80}
l 集合:set(),a=set([1,2,3,4]);一个数值集合 b=set(“hello”),一个唯一字符集合。与列表、元组不同,集合中的元素是无序的,无法通过数字索引,且元素不能重复。
n 并集:a|b => set([1, 2, 3, 4, 'h', 'l', 'o', 'e'])
n 交集:a&b => set([])
n 差集:a-b => set([1, 2, 3, 4]),即在a中不在b中元素
n 对称差集:a^b => set([1, 2, 3, 'e', 'h', 'l', 'o', 4])
n add:a.add(5) => set([1, 2, 3, 4, 5]) #添加一项
n update: a.update([6,7,8]) =>set([1, 2, 3, 4, 5, 6, 7, 8])#添加多项
n remove: a.remove(5) =>set([1, 2, 3, 4, 6, 7, 8])#删除一项
强大的标准库
Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。
Python标准库的主要功能有:
- 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
- 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
- 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
- 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
- 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
- W3C格式支持,包含HTML,SGML,XML的处理。
- 其它功能,包括国际化支持、数学运算、HASH、Tkinter等
无所不包的第三方库
如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面。
“There are currently 30630 packages here.”—— https://pypi.python.org/pypi。
3.3. 总而言之
用下图可以表示Python的强大。
图:Python(来自:xkcd,http://xkcd.com/353/)
4. 还有谁在用Python?
看Python在我工作中的应用,好像没什么说服力,证明不了啥。下面让我们看看有哪些大公司或有名的应用在使用Python,使用了哪些技术。
4.1. 国外
图:谁用在用Python
上图只是列举了部分具有典型代表的公司,要列出所有的实在太困难的,因为太多国外在使用Python了。
Python Google的三大编程语言之一
在Google,C++、Java、Python是使用率排名前三的编程语言,使用Python的开发团队也是Google的第三大研发部门。
在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。
groups.google.com,code.google.com就是运行于Python之上的。此外,Python还广泛的用于基础维护部门。Guido Van Rossum加入Google的第一个项目Google Mondrian,是一个在线的代码预览系统,基于Perforce、BigTable(back-end)以及Python(front-end)。它使用了以下Python相关技术(http://goo.gl/3f5sy):
The application is built on top of Python open source libraries such as the Django framework, smtpd.py mail service, and the wsgiref web server software。
Google雄心勃勃的云计算平台Google App Engine最早支持的Python编程语言。
YouTube主要是Python写的
l Apache
l Python
l Linux(SuSe)
l MySQL
l psyco,一个动态的Python到C的编译器
l lighttpd代替Apache做视频查看
most of the lines of code for YouTube are still in Python. Everytime you watch a YouTube video you are executing a bunch of Python code.
YouTube解决问题的哲学只有一个词:简单。许多YouTube的产品最初只是源于一个简单的Python脚本。
在线视频王者YouTube的技术哲学,http://goo.gl/PHMUE,7 Years Of YouTube Scalability Lessons In 30 Minutes
Quora - Python 驱动
下面内容主要摘自并加入了自己的注释:Quora - Python 驱动,http://goo.gl/28RGq。
Quora 是使用什么语言和框架做的?
What languages and frameworks were used to code Quora?
创始人 Charlie 的回复:
- 后端使用 Python 语言,Pylons 框架,但是框架一半左右被自己的系统替换(LiveNode/webnode2)
- 前端 JavaScript 基于 jQuery
- 用Thrift做后端服务器之间通信(thrift最初由facebook开发,07年四月开放源码,thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。)
- Comet Server 使用Tornado
- hosting 主要使用 Amazon EC2, S3
- 目前数据库使用 MySQL,memcached 做缓存,还有两个用 C++ 写的服务一起作为 data store
- 版本控制用 Git
为什么 Quora 选择 Python 作为开发语言
Why did Quora choose Python for its development?. 下文只是简单整理,不是翻译。
创始人 Adam 的回复里,提到两个创始人正好都比较熟悉 Python. 另外他说明了排除其它语言的过程:
- PHP 根本不考虑。Facebook 陷进去无法脱身,不代表它是目前最好的选择,由此得到的经验是编程语言的选择非常重要而且改变的代价非常大。Adam 此处给了其它几个链接,其中有指出 PHP 一大堆弱点的,也包括一个问题 "Do Facebook engineers enjoy programming in PHP?". 我很赞同 Facebook 的工程师说的,familiarity breeds contempt. 没有完美的语言,每一种语言都有长有短,当把它用到极限的时候,短处就变得很显眼并让人烦恼。我个人认为 PHP 也仍然是不差的选择。
- C# - 看起来不错但是 -
- 他们不想把基础搭建在微软的技术平台上。SQL Server 很好,不过 Quora 需要一大堆开源软件,这些代码即使支持 .NET, 也支持得比较差。
- 不想冒险使用 Mono,因为不知道它能撑多久,而且据说有性能问题
- Java 程序因为一些原因很容易变得更长,写起来比 Python 痛苦多了。
- Scala 太新,也是一种冒险,另外虽然不像 Java 那么差,它也天生继承 JVM 的一些弱点。
Python 虽然有性能问题,但是 Quora 一些性能很关键的代码都用 C++ 写(Python 的优势,Java 做起来相对困难)。至于类型检查的缺乏,Quora 通过完善的单元测试来弥补。
Quora 另一位创始人 Charlie 加了几点:
- 创立 Quora 的时候,Python 有许多很好的 web framework
- Python 的数据结构跟 JavaScript 映射很好,这样 CS 之间交互数据很方便
- Python 代码更易读
- Python 在各方面有很多成熟的 library
为什么 Quora 要用 Pylons 做开发
Why did Quora choose to develop in Pylons?. Charlie 说他们想把 Pylons 的很多东西替换成自己的,比如他们不需要模版和 ORM. 在这方面,Pylons 比 Django 之类的要好。
Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado
其他八项可以查看:http://goo.gl/nzFCy
Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado,是用 Pyhton 语言开发的实时网络服务器,它支持上万的不间断连接,也支持以长轮询(long-polling)方式发布实时数据。
Tornado 最初是由 FriendFeed 公司开发出来的,而 FriendFeed 在 2009 被 Facebook 收购。随后 Facebook 发布Tornado 开源工程,现在包括 Quora 在内的多家网站已使用 Tornado。
Reddit使用Python重写
Reddit(美国最大的网上社区)最早是用 Common Lisp 开发,随之用 Python 进行了重写(2005年底完成)。著名的Python 框架 Web.py 就是 Reddit 当时的员工 Aaron Swartz 开发的,现在 Reddit 的 Web 框架则使用了 Pylons 。在 2009 年 11 月,Reddit 迁移到 Amazon 的云计算平台。前端框架现在用的是 jQuery。或许你早就知道,Reddit网站程序现在已经开源https://github.com/reddit/reddit,如果你感兴趣的话,不妨下载研究。
Dropbox
Dropbox 的99.9%的代码是用Python写的。Python使用在服务器端、桌面客户端、网站控制逻辑,后端的 API 和分析。
使用 Python 语言编写的代码,通过使用PyObjs,WxPython,types,py2exe, py2ap,PyWin32等工具,让Dropbox运行在Windows,Mac和Linux系统。
6 Lessons From Dropbox - One Million Files Saved Every 15 Minutes,http://goo.gl/Qj5sJ。
10亿美元被Facebook收购的Instagram,主要使用Python等开源技术。
应用服务器:
l 使用Django框架。
l 使用Gunicorn作为 WSGI 服务器(过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源)。
l 使用 Fabric 加速部署。
任务队列/发布通知
队列服务使用Gearman,工作实例(都用Python写的)在给定的时间内对队列中的任务进行消费,并分发给不同的服务;对于消息推送,找到的最划算的方案是,一个开源的Twisted 服务 pyapns(A universal Apple Push Notification Service (APNS) provider)来实现,已经为Instagram处理了超过10亿条通知,并且绝对可靠。
参考:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,http://goo.gl/mkfQN;中文版:http://goo.gl/Dkymt。
OpenStack
OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目。
OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。此外,OpenStack也用作建立防火墙内的“私有云”(Private Cloud),提供机构或企业内各部门共享资源。
- 以Python编程语言编写
- 整合Tornado网页服务器、Nebula运算平台
- 使用Twisted软件框架
- 遵循Open Virtualization Format、AMQP、SQLAlchemy等标准
- 虚拟机器软件支援包括:KVM、Xen、VirtualBox、VMware、Hyper-V
4.2. 国内
腾讯
腾讯游戏运营支撑体系的开发团队,在使用django/celery/rabitmq/mongodb开发了一个已广泛使用的内部开放平台。
Django:是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。
Celery:(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。celery用于生产系统每天处理数以百万计的任务。celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。celery是易于集成Django, Pylons and Flask,使用 django-celery,celery-pylons and Flask-Celery 附加包即可。
豆瓣
豆瓣最初使用Python开发,只是用了3个月。洪强宁,《Python于web2.0网站的应用》,http://goo.gl/ZaI9s;《Python在豆瓣的应用》,http://goo.gl/IgeGe
最早的豆瓣就完全使用 Python 开发,后台索引基于 twisted,GUI 使用 Quixote,还用到了 cElementTree,数据库是 MySQL。所以豆瓣天生就有着 Python 的文化。在豆瓣,开发环境正逐步从 Subversion 向 mercurial 迁移,还使用了 Python 编写的 trac 和 IRC,之所以选择 IRC 是因为 IRC 有很大的灵活性,可以编写 Bot 自动化很多东西。除此之外:
l m.douban.com使用:Pylons
l 内部管理系统使用: Django
l DPark系统:使用Python编写,支持迭代计算的MapReduce框架
l DAE(douban app engine):使用Python编写,类似于GAE、SAE,定位为内部的 PaaS 平台。
新浪SAE
新浪Sina App Engine Python,是新浪研发的PaaS(平台即服务)平台,已经开始支持Python了。陈正《Introduction to SAE Python》, http://goo.gl/0lkRm
搜狐邮箱
2007年,搜狐邮件中心基于webpy(除了webpy,还用了优秀的WEB框架 – Tornado),发布了"搜狐闪电邮"的第一个Python版本。之后,Python就在搜狐邮件中心蓬勃的发展起来。到今天,搜狐邮箱已经成为国内最大的Python应用之一。而Python也成为了搜狐邮箱使用最广泛的语言。从运维到开发,从业务系统到基础服务,到处都存在它的影子。
知乎
(摘自知乎官方解答)知乎开发主要用的是friendfeed的框架tornado。Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因-----因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。
但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。
所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。
各种游戏公司
国内一些游戏后台使用Python开发,特别是一些网页游戏。可以搜索下有哪些公司在招聘Python游戏开发,会发现有很多公司在招聘。
下面是几篇在PyCon会议上的文章:
l 王健,《中型角色扮演游戏服务器的Python应用》,http://goo.gl/b2R6M
l 赖勇浩,《Python于 webgame 的应用》,http://goo.gl/1QMOT
l 林伟(skywind),《Python游戏开发探索与发现》中告诉大家Python已经足够简化到让策划人员也能写代码,用Python来描述一个游戏的场景。国内WebGame已经超过国外,在网易大量游戏项目用Python相关内容开发。
5. 是不是想学习Python了?
通过上面的介绍,是不是迫不及待的想学习下Python了。下面推荐学习Python相关工具与文章。
入门资料
l wiki:http://zh.wikipedia.org/zh/Python
l Chinaunix的Python论坛资料
l 《OReilly-Learning-Python-4th-Edition-Oct-2009》
l 《简明 Python 教程》(中文),对应的英文版是《A Byte of Python》
l 深入 Python 3,http://goo.gl/cyrUY
工具
l UliPad 代码编辑工具(本身由python编写)
l Pydev:eclipse + pydev插件