译者按:原文写于2011年底,虽然文中关于Python 3的一些说法能够说已经不成立了,可是做为一篇面向从其余语言转型到Python的程序员来讲,本文对Python的生态系统仍是作了较为全面的介绍。文中提到了一些第三方库,可是Python社区中强大的第三方库并不止这些,欢迎各位Pytonistas补充。html
原文连接:http://mirnazim.org/writings/python-ecosystem-introduction/
译文连接:http://codingpy.com/article/python-ecosystem-introduction/python
开发者从PHP、Ruby或其余语言转到Python时,最常碰到的第一个障碍,就是缺少对Python生态系统的全面了解。开发者常常但愿能有一个教程或是资源,向他们介绍如何以大体标准的方式完成大部分的任务。linux
本文中的内容,是对我所在公司内部维基百科的摘录,记录了面向网络应用开发的Python生态系统基础知识,目标受众则是公司实习生、培训人员以及从其余语言转型到Python的资深开发者。git
文中所列的内容或资源是不完整的。我也打算把它当成一项一直在进行中的工做(work in perpetual progress)。但愿通过不断的增补修订,本文会成为Python生态系统方面的一篇详尽教程。程序员
本文的目的,不是教你们Python编程语言。读完这篇教程,你也不会瞬间变成一名Python高手。我假设你们已经有必定的Python基础。若是你是初学者,那么别再继续读下去了。先去看看Zed Shaw所写的《笨办法学Python》,这是本质量很高的免费电子书,看完以后再回头阅读这篇教程吧。github
我假设大家使用的是Linux(最好是Ubuntu/Debian)或是类Linux操做系统。为何?由于这是我最熟悉的系统。我在Windows平台或Mac OS X平台上,没有专业的编程经验,只是测试过不一样浏览器的兼容性。若是你用的是这两个平台,那么请参考下面的资料安装Python。sql
你还可以使用搜索引擎,查找你使用的操做系统中安装Python的最好方法。若是你有什么疑问,我强烈建议你去Stack Overflow平台上提问。
Python 2.x是目前的主流;Python 3是崭新的将来。若是你不关心这个问题,能够直接跳到下面的Python安装部分。(译者注:原文做者写这篇文章时是2011年,当时Python 3才发展没几年。)
刚接触Python的话,安装3.x版本看上去是很天然的第一步,可是这可能并非你想要的。
目前有两个积极开发中的Python版本——2.7.x与3.x(也被称为Python 3, Py3K和Python 3000)。Python 3是一个不一样于Python 2的语言。两者在语义、语法上,既存在细微的区别,又有着大相径庭的一面。截至今天,Python2.6/2.7是安装数量和使用度最高的版本。许多主流的Python库、框架、工具都没有作到100%兼容Python 3。
所以,最稳妥的选择就是使用2.x版(更准确的说,即2.7.x)。务必只在你须要或者彻底了解状况的前提下,才选择Python 3。
Python 3 Wall of Shame网站记录了Python 3对各类库的兼容状况。在使用Python 3以前,仔细查阅下这个网站的内容。
译者注:如今,主流第三方库和框架对Python 3的支持度已经很高。根据py3readiness网站的统计,360个最受欢迎的Python包中已经有315个支持Python 3。具体的支持状况,能够查看这个网站。必定程度上说,Python 3已经成为新的主流。
Python的解释器,又叫作Python虚拟机,它有多种不一样的实现。其中,主流实现方式是CPython,装机量也最高,同时也是其余虚拟机的参考实现。
PyPy是利用Python语言实现的Python;Jython则使用Java实现,并运行在Java虚拟机之上;IronPython是用.NET CLR实现的Python。
除非真的有重大理由,不然应该选择CPython版本的实现,避免出现意外状况。
若是这些有关版本和虚拟机的唠叨话让你读了头疼,那你只须要使用CPython 2.7.x便可。
大部分Linux/Unix发行版和Mac OS X都预装了Python。若是你没有安装或者已有的版本比较旧,那么你能够经过下面的命令安装2.7.x版:
Ubuntu/Debian及其衍生系统
$ sudo apt-get install python2.7
sudo
是类Unix系统中的一个程序,可让用户以其余用户的权限(一般是超级用户或root用户)运行程序。
Fedora/Red Hat及相似系统
sudo yum install python2.7
在RHEL(Red Hat Enterprise Linux的缩写)平台上,你可能须要启用EPEL软件源(repositories),才能正常安装。
在本文后面的示例中,我会使用sudo
程序;你应将其替换为本身版本中的相应命令或程序。
首先你须要了解的是,Python没有默认的包管理工具。事实上,Python语言中包的概念,也是十分松散的。
你可能也知道,Python代码按照模块(module)划分。一个模块,能够是只有一个函数的单个文件,也能够是包含一个或多个子模块的文件夹。包与模块之间的区别很是小,每一个模块同时也能够视做一个包。
那么模块与包之间,到底有什么区别?要想解答这个问题,你首先要了解Python是如何查找模块的。
与其余编程环境相似,Python中也有一些函数和类(好比str
,len
和Exception
)是存在于全局做用域(global scope,在Python中被称为builtin scope)的,其余的函数和类则须要经过import
语句进行引用。例如:
>>> import os >>> from os.path import basename, dirname
这些包就在你的文件系统中的某处,因此能被import
语句发现。那么Python是怎么知道这些模块的地址?原来,在你安装Python虚拟机的时候,就自动设置了这些地址。固然平台不一样,这些地址也就不同。
你能够经过sys.path
查看系统中的包路径。这是个人笔记本运行该命令以后的输出结果,系统是Ubuntu 11.10 Oneric Ocelot。
>>> import sys >>> print sys.path ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
这行代码会告诉你Python搜索指定包的全部路径,这个路径就存储在一个Python列表数据类型中。它会先从第一个路径开始,一直往下检索,直到找到匹配的路径名。这意味着,若是两个不一样的文件夹中包含了两个同名的包,那么包检索将会返回其遇到的第一个绝对匹配地址,不会再继续检索下去。
你如今可能也猜到了,咱们能够轻松地修改(hack)包检索路径,作到你指定的包第一个被发现。你只须要运行下面的代码:
>>> sys.path.insert(0, '/path/to/my/packages')
尽管这种作法在不少状况下十分有用,可是你必须牢记sys.path
很容易被滥用。务必在必要时才使用这种方法,而且不要滥用。
site
模块控制着包检索路径设置的方法。每次Python虚拟机初始化时,就会被自动引用。若是你想更详细地了解整个过程,能够查阅官方文档。
PYTHONPATH
是一个能够用来加强默认包检索路径的环境变量。能够把它看做是一个PATH
变量,可是一个只针对Python的变量。它只是一些包含有Python模块的文件路径列表(不是sys.path
所返回的Python列表),每一个路径之间以:分隔。设置方法很简单,以下:
export PYTHONPATH=/path/to/some/directory:/path/to/another/directory:/path/to/yet/another/directory
在某些状况下,你不用覆盖已有的PYTHONPATH
,只须要在开头或结尾加上新的路径便可。
export PYTHONPATH=$PYTHONPATH:/path/to/some/directory # Append export PYTHONPATH=/path/to/some/directory:$PYTHONPATH # Prepend
PYTHONPATH、
sys.path.insert`和其余相似的方法,都是hack小技巧,通常状况下最好不要使用。若是它们可以解决本地开发环境出现的问题,可使用,可是你的生产环境中不该该依赖这些技巧。要取得一样的效果,咱们还能够找到更加优雅的方法,稍后我会详细介绍。
如今你明白了Python如何查找已安装的包,咱们就能够回到一开始的那个问题了。Python中,模块和包的区别究竟是什么?包就是一个或多个模块/子模块的集合,通常都是以通过压缩的tarball文件形式传输,这个文件中包含了:1. 依赖状况(若是有的话);2.将文件复制到标准的包检索路径的说明;3. 编译说明——若是文件中包含了必需要通过编译才能安装的代码。就是这点区别。
若是想利用Python进行真正的编程工做,你从一开始就须要根据不一样的任务安装第三方包。
在Linux系统上,至少有3种安装第三方包的方法。
使用系统自己自带的包管理器(deb, rpm等)
经过社区开发的相似pip
, easy_install
等多种工具
从源文件安装
这三种方法作的几乎是同一件事情,即安装依赖包,视状况编译代码,而后把包中模块复制到标准包检索路径。
尽管第二种和第三种方法在全部操做系统中的实现都一致,我仍是要再次建议你查阅Stack Overflow网站的问答,找到你所使用系统中其余安装第三方包的方法。
在安装第三方包以前,你得先找到它们。查找包的方法有不少。
你使用的系统自带的包管理器
使用系统自带的包管理器安装,只须要在命令行输入相应命令,或是使用你用来安装其余应用的GUI应用便可。举个例子,要在Ubuntu系统上安装simplejson
(一个JSON解析工具),你能够输入下面的命令:
$ sudo apt-get install python-simplejson
easy_install
已经不太受开发者欢迎。本文将重点介绍easy_install
的替代者——pip
。
pip
是一个用来安装和管理Python包的工具。它并非一个Python虚拟机自带的模块,因此咱们须要先安装。在Linux系统中,我通常会这样操做:
$ sudo apt-get install python-pip
在安装其余包以前,我老是会把pip
升级到PyPI中的最新版本,由于Ubuntu默认源中的版本比PyPI的低。我这样升级pip
。
$ sudo pip install pip --upgrade
如今,你能够经过运行run pip install package-name
,安装任何Python包。因此,要安装simplejson
的话,你能够运行如下命令:
$ sudo pip install simplejson
移除包也同样简单。
$ sudo pip uninstall simplejson
pip
默认会安装PyPI上最新的稳定版,可是不少时候,你会但愿安装指定版本的包,由于你的项目依赖那个特定的版本。要想指定包的版本,你能够这样作:
$ sudo pip install simplejson==2.2.1
你还会常常须要升级、降级或者重装一些包。你能够经过下面的命令实现:
$ sudo pip install simplejson --upgrade # Upgrade a package to the latest version from PyPI $ sudo pip install simplejson==2.2.1 --upgrade # Upgrade/downgrade a package to a given version
接下来,假设你想安装某个包的开发版本,可是代码没有放在PyPI上,而是在版本控制仓库中,你该怎么办?pip
也能够知足这个需求,可是在此以前,你须要在系统上安装相应的版本控制系统(VCS)。在Ubuntu平台,你能够输入下面的命令:
$ sudo apt-get install git-core mercurial subversion
安装好VCS以后,你能够经过下面的方式从远程仓库中安装一个包:
$ sudo pip install git+http://hostname_or_ip/path/to/git-repo#egg=packagename $ sudo pip install hg+http://hostname_or_ip/path/to/hg-repo#egg=packagename $ sudo pip install svn+http://hostname_or_ip/path/to/svn-repo#egg=packagename
从本地仓库中安装也一样简单。注意下面文件系统路径部分的三个斜杠(///)。
$ sudo pip install git+file:///path/to/local/repository
经过git
协议安装时,请注意,你要像下面这样使用git+git
前缀:
$ sudo pip install git+git://hostname_or_ip/path/to/git-repo#egg=packagename
如今,你可能在纳闷这些命令中的eggs
是什么东西?目前你只须要知道,一个egg
就是经zip压缩以后的Python包,其中包含了包的源代码和一些元数据。pip
在安装某个包以前,会构建相关的egg信息。你能够打开代码仓库中的setup.py
文件,查看egg的名字(几乎都会注明)。找到setup
部分,而后看看有没有一行相似name="something"
的代码。你找到的代码可能会和下面这段代码相似(来自simplejson包中的setup.py
文件)。
setup( name="simplejson", # <--- This is your egg name version=VERSION, description=DESCRIPTION, long_description=LONG_DESCRIPTION, classifiers=CLASSIFIERS, author="Bob Ippolito", author_email="bob@redivi.com", url="http://github.com/simplejson/simplejson", license="MIT License", packages=['simplejson', 'simplejson.tests'], platforms=['any'], **kw)
假如没有setup.py
文件呢?你该怎么查找egg的名字?答案是,你根本不用去找。只要把包的源代码拷贝到你的项目文件夹,以后就能够和你本身写的代码同样引用和使用啦。
以上全部的例子,都是在系统层面安装指定的包。若是你使用pip install
时,加上--user
这个参数,这些包将会安装在该用户的'~/.local`文件夹之下。例如,在个人机器上,运行效果是这样的:
$ pip install --user markdown2 Downloading/unpacking markdown2 Downloading markdown2-1.0.1.19.zip (130Kb): 130Kb downloaded Running setup.py egg_info for package markdown2 Installing collected packages: markdown2 Running setup.py install for markdown2 warning: build_py: byte-compiling is disabled, skipping. changing mode of build/scripts-2.7/markdown2 from 664 to 775 warning: install_lib: byte-compiling is disabled, skipping.
changing mode of /home/mir/.local/bin/markdown2 to 775 Successfully installed markdown2 Cleaning up...
注意markdown2这个Python包的安装路径(/home/mir/.local/bin/markdown2
)
不在系统层面安装全部的Python包有不少理由。稍后在介绍如何为每一个项目设置单独、孤立的Python环境时,我会具体说明。
从源文件安装Python包,只须要一行命令。将包文件解压,而后运行下面的命令:
cd /path/to/package/directory python setup.py install
尽管这种安装方法与其余的方法没什么区别,可是要记住:pip
永远是安装Python包的推荐方法,由于pip
可让你轻松升级/降级,不须要额外手动下载、解压和安装。从源文件安装时若是其余方法都行不通时,你的最后选择(通常不会存在这种状况)。
虽然咱们已经介绍了大部分与包安装相关的内容,仍有一点咱们没有涉及:含有C/C++代码的Python包在安装、使用以前,须要先编译。最明显的例子就是数据库适配器(database adapters)、图像处理库等。
尽管pip
能够管理源文件的编译,我我的更喜欢经过系统自带的包管理器安装这类包。这样安装的就是预编译好的二进制文件。
若是你仍想(或须要)经过pip
安装,在Ubuntu系统下你须要执行下面的操做。
安装编译器及相关工具:
$ sudo apt-get install build-essential
安装Python开发文件(头文件等):
$ sudo aptitude install python-dev-all
若是你的系统发行版本中没有提供python-dev-all
,请查找名字相似python-dev
、python2.X-dev
的相关包。
假设你要安装psycopg2
(PostgreSQL数据库的Python适配器),你须要安装PostgreSQL的开发文件。
$ sudo aptitude install postgresql-server-dev-all
知足这些依赖条件以后 ,你就能够经过pip install
安装了。
$ sudo pip install psycopg2
这里应该记住一点:并不是全部这类包都兼容pip安装方式。可是,若是你自信能够成功编译源文件,而且(或者)已经有目标平台上的必要经验和知识,那么你彻底能够按照这种方式安装。
不一样的人设置开发环境的方法也不一样,可是在几乎全部的编程社区中,确定有一种方法(或者超过一种)比其余方法的接受度更高。尽管开发环境设置的与别人不一样没有问题,通常来讲接受度更高的方法经受住了高强度的测试,并被证明能够简化一些平常工做的重复性任务,而且能够提升可维护性。
Python社区中设置开发环境的最受欢迎的方法,是经过virtualenv。Virtualenv是一个用于建立孤立Python环境的工具。那么如今问题来了:为何咱们须要孤立的Python环境?要回答这个问题,请容许我引用virtualenv的官方文档。
咱们要解决的问题之一,就是依赖包和版本的管理问题,以及间接地解决权限问题。假设你有一个应用须要使用LibFoo V1,可是另外一个应用须要V2。那么你如何使用两个应用呢?若是你把须要的包都安装在
/usr/lib/python2.7/site-packages
(或是你的系统默认路径),很容易就出现你不当心更新了不该该更新的应用。
简单来讲,你的每个项目均可以拥有一个单独的、孤立的Python环境;你能够把所需的包安装到各自孤立的环境中。
仍是经过pip
安装virutalenv。
$ sudo pip install virtualenv
安装完以后,运行下面的命令,为你的项目建立孤立的Python环境。
$ mkdir my_project_venv $ virtualenv --distribute my_project_venv # The output will something like: New python executable in my_project_venv/bin/python Installing distribute.............................................done. Installing pip.....................done.
那么这行代码都作了些什么呢?你建立了一个名叫my_project_venv
的文件夹,用于存储新的Python环境。--distribute
参数告诉virtualenv使用基于distribute
包开发的新的、更好的打包系统,而不是基于setuptools
的旧系统。你如今只须要知道,--distribute
参数将会自动在虚拟环境中安装pip
,免去了手动安装的麻烦。随着你的Python编程经验和知识增长,你会慢慢明白这个过程的具体细节。
如今查看my_project_venv
文件夹中的内容,你会看到相似下面的文件夹结构:
# Showing only files/directories relevant to the discussion at hand . |-- bin | |-- activate # <-- Activates this virtualenv | |-- pip # <-- pip specific to this virtualenv | `-- python # <-- A copy of python interpreter `-- lib `-- python2.7 # <-- This is where all new packages will go
经过下面的命令,激活虚拟环境:
$ cd my_project_venv $ source bin/activate
使用source
命令启动activate
脚本以后,你的命令行提示符应该会变成这样:
:::bash (my_project_venv)$
虚拟环境的名称会添加在$提示符的前面。
如今运行下面的命令,关闭虚拟环境:
:::bash (my_project_venv)$ deactivate
当你在系统层面安装virtualenv时(若是激活了虚拟环境,请先关闭),能够运行下面的命令帮助本身理解。
首先,咱们来看看若是咱们在终端输入python
或者pip
,系统会使用哪一个执行文件。
$ which python /usr/bin/python $ which pip /usr/local/bin/pip
如今再操做一次,可是首先要激活virtualenv,注意输出结果的变化。在个人机器上,命令的输出结果时这样的:
$ cd my_project_venv $ source bin/activate (my_project_venv)$ which python /home/mir/my_project_venv/bin/python (my_project_venv)$ which pip /home/mir/my_project_venv/bin/pip
virtualenv
所作的,就是拷贝了一份Python可执行文件,而后建立了一些功能脚本以及你在项目开发期间用于安装、升级、删除相关包的文件夹路径。它还施展了一些包检索路径/PYTHONPATH魔法,确保实现如下几点:1. 在你安装第三方包时,它们被安装在了当前激活的虚拟环境,而不是系统环境中;2. 当在代码中引用第三方包时,当前激活的虚拟环境中的包将优先于系统环境中的包。
这里有很重要的一点要注意:系统Python环境中安装的全部包,默认是能够在虚拟环境中调用的。这意味着,若是你在系统环境中安装了simplejson
包,那么全部的虚拟环境将自动得到这个包的地址。你能够在建立虚拟环境时,经过添加--no-site-packages
选项,取消这个行为,就像这样:
$ virtualenv my_project_venv --no-site-packages
virtualenvwrapper
是virtualenv
的封装器(wrapper),提供了一些很是好的功能,便捷了建立、激活、管理和销毁虚拟环境的操做,不然将会是件杂事。你能够运行以下命令安装virtualenvwrapper
:
$ sudo pip install virtualenvwrapper
安装结束以后,你须要进行一些配置。下面是个人配置:
if [ `id -u` != '0' ]; then export VIRTUALENV_USE_DISTRIBUTE=1 # <-- Always use pip/distribute export WORKON_HOME=$HOME/.virtualenvs # <-- Where all virtualenvs will be stored source /usr/local/bin/virtualenvwrapper.sh export PIP_VIRTUALENV_BASE=$WORKON_HOME export PIP_RESPECT_VIRTUALENV=true
这些配置中,惟一必须的是WORKON_HOME
与source /usr/local/bin/virtualenvwrapper.sh
。其余的配置则是根据个人我的偏好进行的。
将上面的配置添加到~/.bashrc
文件的最后,而后在你当前打开的终端界面中运行下面的命令:
$ source ~/.bashrc
关掉全部打开的终端窗口和Tab窗口,也能取得一样地效果。当你再次打开终端窗口或Tab窗口时,~/.bashrc
将会被执行,自动设置好你的virtualenvwrapper
。
如今若是想建立、激活、关闭或是删除虚拟环境,你能够运行下面的代码:
$ mkvirtualenv my_project_venv $ workon my_project_venv $ deactivate $ rmvirtualenv my_project_venv
virtualenvwrapper还支持tab自动补全功能。
你能够前往virtualenvwrapper项目主页查看更多命令和配置选项。
pip
与virtualenv
结合使用,能够为项目提供基本的依赖包管理功能。
你可使用pip freeze
导出目前安装的包列表。例如,下面就是我用来开发这个博客网站所用的Python包:
$ pip freeze -l Jinja2==2.6 PyYAML==3.10 Pygments==1.4 distribute==0.6.19 markdown2==1.0.1.19
注意,我使用了-l选项。它告诉pip
只导出当前激活的虚拟环境中安装的包,忽略全局安装的包。
你能够将导出的列表保存至文件,并把文件添加到版本控制系统(VCS)。
$ pip freeze -l > requirements.txt
经过pip
,咱们能够从写入了pip freeze
命令结果的文件中,安装相应的包。
前面咱们介绍了有关Python版本、虚拟机和包管理的基础知识,可是平常工做中还有其余任务须要使用专门的工具来完成。虽然我没法详细介绍每个工具,我会尽可能作一个大概的介绍。
提早说声对不起,由于下面介绍的大部分工具都是与网络应用开发相关的。
提供在Python中进行编程的优秀编辑器有不少。我我的倾向于Vim,可是我不想引起一场编辑器优劣大战。
对Python编程支持较好地编辑器和集成开发环境(IDEs),主要有Vim/GVim, Emacs, GNOME主题下的GEdit, Komodo Edit, Wing IDE, PyCharm等。还有其余编辑器,可是上面列举的这些应该是最受欢迎的。你应该选择最适合本身的工具。
Pyflakes是一个简单的程序,经过分析文件的文本内容,检查Python源文件中的错误。它能够检查语法和部分逻辑错误,识别被引用但没有使用的模块,以及只使用了一次的变量,等等。
你能够经过pip
安装:
$ pip install pyflakes
而后像下面那样,在命令行调用pyflakes,传入Python源文件做为参数:
$ pyflakes filename.py
Pyflakes还能够嵌入到你的编辑器中。下面这张图显示的是嵌入了Vim以后的状况。注意出现了红色的波浪线。
你能够在Stack Overflow上咨询如何在你使用的编辑器重添加Pyflakes支持。
Requests库让你轻轻松松使用HTTP协议。
首先经过pip
安装:
$ pip install requests
下面是一个简单的使用示例:
>>> import requests >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) >>> r.status_code 204 >>> r.headers['content-type'] 'application/json' >>> r.content ...
更多详情,请查看Requests的文档。
Flask是一个基于Werkzeug与Jinja2这两个库的Python微框架。
首先经过pip
安装:
$ pip install Flask
下面是一个简单的使用示例:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
这样运行Flask应用:
$ python hello.py
Running on http://localhost:5000/
Django是一个全栈网络框架。它提供了ORM、HTTP库、表格处理、XSS过滤、模板引擎以及其余功能。
这样经过pip
安装:
$ pip install Django
前往Django官网,跟着教程学习便可。很是简单。
Fabric是一个命令行工具,能够简化使用SSH进行网站部署或执行系统管理任务的过程。
它提供了一套基本的操做,能够执行本地或远程命令行命令,上传/下载文件,以及提示用户进行输入或者取消执行等辅助性功能。
你能够经过pip
安装:
$ pip install fabric
下面是用Fabric写的一个简单任务:
from fabric.api import run def host_type(): run('uname -s
接下来,你能够在一个或多个服务器上执行该任务:
$ fab -H localhost host_type [localhost] run: uname -s [localhost] out: Linux Done. Disconnecting from localhost... done.
若是你的工做涉及科学计算或数学计算,那么SciPy就是必不可少的工具。
SciPy (pronounced "Sigh Pie") 是一个开源的数学、科学和工程计算包。SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其余科学与工程中经常使用的计算。与其功能相相似的软件还有MATLAB、GNU Octave和Scilab。SciPy目前在BSD许可证下发布。它的开发由Enthought资助
前往SciPy官网,获取详细的下载/安装说明以及文档。
虽然PEP 8自己不是一个工具,但毋庸置疑的是,它是Python开发方面一个很是重要的文件。
PEP 8这个文件中,定义了主流Python发行版本中标准库的编码规范。文件的惟一目的,就是确保其余的Python代码都能遵照一样地代码结构以及变量、类和函数命名规律。确保你充分了解并遵循该风格指南。
Python的标准库内容很是丰富,提供了大量的功能。标准库中包含了众多内建模块(built-in modules,用C语言编写的),能够访问相似文件读/写(I/O)这样的系统功能,还包括了用Python编写的模块,提供了平常编程中许多问题的标准解决方案。其中一些模块的设计思路很明显,就是要鼓励和加强Python程序的可移植性,所以将平台相关的细节抽象为了避免依赖于平台的API接口。
查看标准库的官方文档。
David Goodger的《如何像Python高手同样编程》一文,深刻介绍了许多Python的惯用法和技巧,能够马上为你增添许多有用的工具。
Doug Hellmann的系列文章Python Module of the Week。这个系列的焦点,是为Python标准库中模块编写示例代码。
我在本文中所介绍的内容,触及的还只是Python生态系统的表面。Python世界中,几乎针对每个你能想象到的任务,都存在相关的工具、库和软件。这些明显没法在一篇文章中尽述。你必需要本身慢慢探索。
Python有伟大的社区,社区中的人很聪明,也颇有耐心,乐于帮助Python语言的初学者。因此,你能够选择一个最喜欢的开源项目,去它的IRC频道找人聊天;关注邮件列表,并积极提问;和有丰富Python系统实施经验的人交谈。慢慢地,随着你的经验和知识逐步积累,你也会成为他们之中的一员。
最后,我为你们推荐Python之禅。反复回味、思考这几段话,你必定会有所启发!
>>> import this 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!