我们重点讲解如何在基于Visual C++2010 开发Python的调用,先介绍下Python,
Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。它的名字来源于一个喜剧,也许最初设计Python这种语言的人并没有想到今天Python会在工业和科研上获得如此广泛的使用。xx的自由软件作者Eric Raymond在他的文章《如何成为一名黑客》中,将Python列为黑客应当学习的四种编程语言之一,并建议人们从Python开始学习编程。
下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的{dy}个程序:
在python2.x版本中
#!/usr/bin/env python
print "Hello, world!"
或者:
import sys
sys.stdout.write("Hello, world\n")
///////
在python3.x中
print是一个完xx全的函数,需要修改成:
print('Hello world!')
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为 ABC 语言的一种继承。之所以选中 Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在 Python 中避免这一错误(的确如此,Python 与其它的语言如C、C++和Java结合的非常好)。同时,他还想实现在 ABC 中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。实际上,{dy}个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。
Python在编程语言中的定位
很多大规模软件开发计划例如 Zope, Mnet 及 BitTorrent. Google都在广泛地使用它。
通常认为,Python是一种解释性的语言,但是这种说法是不正确的,实际上,Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。
基于C的Python编译出的字节码文件,通常是.pyc格式。
在实际开发中,python常被昵称为胶水语言,这不是说他会把你的手指粘住,而是说他能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,速度要求非常高,就可以用C++重写。
可扩充性可说是Python作为一种编程语言的特色。新的内置模块(module)可以用C 或 C++写成。而我们也可为现成的模块加上Python的接口。Python可以使用户避免过分的语法的羁绊而将精力主要集中到所要实现的程序任务上。
Python也被称为是一门清晰的语言。因为它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要有一种{zh0}的方法来解决就好了。这在由Tim Peters写的python格言(称为The Zen of Python)里面表述为:
There should be one-- and preferably only one --obvious way to do it.
有意思的是,这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There's More Than One Way To Do It)xx相反。这似乎是人们常把Perl和Python互相比较的重要原因。
Python语言是一种清晰的语言的另一个意思是,它的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。这样有意的强制程序员养成良好的编程习惯。其中很重要的一项就是Python的缩进规则。
例如if语句:
if ageAPI,能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。
图形处理,有PIL、Tkinter等图形库支持,能方便进行图形处理。
数学处理,NumPy扩展提供大量与许多标准数学库的接口。
文本处理,python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。
数据库编程,程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,Mysql、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。
网络编程,提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。
作为Web应用的开发语言,支持{zx1}的XML技术。
多媒体应用,Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。
Python的库
由于设计者和开源社区的共同努力,在python中有大量优秀的库可以被直接调用以高效地完成不同需求的工作。这里列举一些常见常用的库:
Tkinter———— Python默认的图形界面接口。
Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言,用于简化shell下复杂程序的开发,Tk工具包是和Tcl一起开发的,目的是为了简化用户接口的设计过程。Tk工具包由许多不同的小部件,如一个按钮、一个滚动条等。通过Tk提供的这些小部件,我们就可快速地进行GUI开发。Perl、Scheme等语言也利用Tk库进行GUI开发。Tkinter是跨平台,在各种平台下都能使用。
Python Imaging Library(PIL)————python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。
Pmw(Python megawidgets)Python超级GUI组件集————一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。
PyXML———— 用Python解析和处理XML文档的工具包,包中的4DOM是xx相容于W3C DOM规范的。它包含以下内容:
xmlproc: 一个符合规范的XML解析器。
Expat: 一个快速的,非验证的XML解析器。 还有其他
和他同级别的还有 PyHtml PySGML
PyGame———— 用于多媒体开发和游戏软件开发的模块。
PyOpenGL———— 模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。
NumPy、NumArray和SAGE———— NumArray是Python的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的低层代码使用C来编写,所以速度的优势很明显。NumPy是Numarray的后继者,用来代替NumArray。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代Magma, Maple, Mathematica和Matlab 这类工具。
MySQLdb模块———— 用于连接MySQL数据库。还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据库。
PyGTK ———— 用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的那个库。有了它,你xx可以自信的尝试自己制造Photoshop
PyQt ———— 用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。
PyMedia ———— 用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。
Psyco ———— 一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。
Python-ldap ———— 提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。
smtplib模块 ———— 发送电子邮件。
ftplib模块 ———— 定义了FTP类和一些方法,用以进行客户端的ftp编程。我们可用python编写一个自己的ftp客户端程序,用于下载文件或镜像站点。如果想了解ftp协议的详细内容,请参考RFC959。
xmpppy模块 ———— Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。
下面这些就不详细介绍,只列出名字和功能
adodb ———— ADO数据库连接组件
bsddb3 ———— BerkeleyDB的连接组件
chardet ———— 编码检测
scons ———— 项目构建工具,写好了模板用起来还是很方便的
sendpkt ———— Python发包
setuptools ———— 一套python包管理机制
Cheetah ———— 构建和扩充任何种类的基于文本的内容
pycurl ———— URL处理工具
pydot ———— 画图的,graphiz
pyevent ———— Python的事件支持
pylint ———— 培养良好的编码习惯
Pylons ———— 又一个web framework
pypcap ———— 抓包的
pysqlite2 ———— SQLite的连接组件
python-dnet ———— 控制网络安全的其他设备
pythonwin ———— Python的Windows扩展
pywmi ———— 省了好多折腾功夫
reportlab ———— Python操作PDF的Libary。
scapy ———— 网络包构建分析框架,可编程的wireshark,有兴趣的google “Silver Needle in the Skype”
simplejson ———— JSON的支持
sqlalchemy ———— SQL数据库连接池
SQLObject ———— 数据库连接池
cherrypy ———— 一个WEB framework
ctypes ———— 用来调用动态链接库
Cx-oracle ———— 连接oracle的工具
DBUtils ———— 数据库连接池
django ———— 一个WEB framework
DPKT ———— raw-scoket网络编程
docutils ———— 用来写文档的
dpkt ———— 数据包的解包和组包
feedparser ———— rss解析
Kodos ———— 正则表达式调试工具
Mechanize ———— 爬虫连接网站常用
pefile ———— windows pe文件解析器
py2exe ———— 用来生成windows可执行文件
twisted ———— 巨无霸的网络编程框架
winpdb ———— 自己的程序或者用别的库不太明白的时候就靠它了
wxPython ———— GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构(对于初学者或者对设计要求不高的用户来说,使用 Boa Constructor可以方便迅速的进行wxPython的开发)
PIL———— Python 的图像处理库,可以打开数十种图像格式,还提供许多图像处理函数,如图像增强、滤波算法等。
Pyro———— Python实现与JAVA RMI类似的技术
PLY———— 基于Python的LEX、YACC的语言工具
Corepy———— 使用Python开发编写x86汇编程序
LightCloud———— Python实现的分布式的键-值数据库
Parallel Python(PP)———— 轻松开发SMP、集群并行计算的库
开源社区的工作已经完成到这样的程度,基本上各种常见的编程需求都已经有非常成熟稳定高速的模块来实现,你所需要做的,只是去把它找出来然后阅读文档。
定义一个简单的Python脚本
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······15001.def welcome(name):
02. return "Hello '" + name + "' from IronPython"
打开VS2010,建立一个C++,CLR windows form窗体“Python范例”
,删掉form1,在函数初始化的时候,代码如下
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······15001.using System;
02.using IronPython::Hosting;
03.using Microsoft::Scripting::Hosting;
04.namespace Python范例
05.{
06.
07. private static void Main(string[] args)
08. {
09. Console.WriteLine("载入 helloworld.py...");
10.
11. ScriptRuntime py = Python.CreateRuntime();
12. dynamic helloworld = py.UseFile("helloworld.py");
13.
14. Console.WriteLine("helloworld.py 载入!");
15.
16. for (int i = 0; i < 1000; i++)
17. {
18. Console.WriteLine(helloworld.welcome("Employee #{0}"), i);
19. }
20. Console.ReadLine();
21.
22. }
23.}
程序xx执行成功,大家在开发C++的时候,某些麻烦的工作可以让Python搞定