第 1 章 Python 入门
各位在学习新技术或新编程语言时,是否对准备工作发过愁呢?往往学习还没有正式开始,就先在准备工作上迷失了方向。好不容易硬着头皮开始准备,却发现安装完一个软件之后又不知道该干什么了。最后自以为准备完毕兴冲冲地要开工时,才注意到应该装好的东西并没有正确安装。到头来,大把的时间花在了准备阶段上,再无心情去学习了。类似这种情况不知道各位遇到过没有。
搭建 Python 开发环境时要考虑 OS 与版本等诸多组合,所以这个过程很难保证一帆风顺。独立开发者,尤其是自学成才的开发者们,大多是以网页或书籍上的信息作为参考,然后用自己独有的方法进行搭建。但即便如此,其中有些共通点还是需要了解的。
第 1 章中,我们将按部就班地了解对个人开发者来说共通的环境搭建顺序,让初学者也能顺利搭建环境。
因此,我们将在第 1 章中对下列项目进行重点学习。其中有部分内容涉及虚拟机,所以我们将学习时使用的本地实体机的 OS 称为“主 OS”,虚拟机的 OS 称为“客 OS”。已经自己搭建好 Python 开发环境的读者可以跳过本章。
安装 Python
安装 Mercurial
关于编辑器以及开发辅助工具
1.1 安装 Python
本节将带领各位安装一些便于在 Ubuntu 上使用 Python 进行开发的工具和包。
NOTE
本书以 Ubuntu 14.04(Server 版)作为 Python 开发环境的OS。另外,我们使用 OracleVMVirtualBox 承载客 OS。搭建环境的相关内容收录在附录 A 以及附录 B 中,初学者请先参考附录再阅读以下内容。
1.1.1 安装 deb 包
Ubuntu 可以用 apt-get
命令管理包。我们先来更新所有包,同时安装一些 Python 开发所需的包。
LIST 1.1 deb 包的更新、升级
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
$ sudo apt-get -y install build-essential
$ sudo apt-get -y install libsqlite3-dev
$ sudo apt-get -y install libreadline6-dev
$ sudo apt-get -y install libgdbm-dev
$ sudo apt-get -y install zlib1g-dev
$ sudo apt-get -y install libbz2-dev
$ sudo apt-get -y install sqlite3
$ sudo apt-get -y install tk-dev
$ sudo apt-get -y install zip
$ sudo apt-get -y install libssl-dev
如 LIST 1.1 所示,我们在执行命令时添加了 -y 选项。这样一来,在安装过程中被询问 Yes 或 No 时,计算机会自动帮我们选择 Yes。如果各位想亲自逐个确认,可以将 -y 选项删去。
build-essential 包可以批量安装 Python 在 Ubuntu 上进行构建时所需的全部工具(gcc、make 等)。Python 本身在涉及某些包和模块时也必须有这些基本工具才能进行安装,因此建议各位先装好它们。
接下来安装 Python 相关的包(LIST 1.2)。
LIST 1.2 安装 Python 相关的包
# 安装python-dev
$ sudo apt-get -y install python-dev
# 安装pip
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
pip 是管理 Python 第三方库的工具。虽然它也能通过 apt 命令进行安装,但那样安装的版本较低,因此我们使用 get-pip.py
来安装最新版。
至此 Python 相关的包已经安装完毕。最后我们来查看一下 Ubuntu 默认自带的 Python 的版本。
LIST 1.3 查看 Python 的版本
$ python -V
Python 2.7.6
输入 LIST 1.3 中的命令,我们便能够查看到当前安装的 Python 版本。Ubuntu 默认安装的是 Python 2.7.6。
专栏 ensurepip
Python 3.4 具有 ensurepip 模块,可在安装 Python 的同时捆绑安装pip。这个模块是在 Python 2.7.9 之后加入的。支持 ensurepip 的 Python 可以直接使用 pip,不需要执行
get-pip.py
来进行安装。另外,执行python -m ensurepip -U
可以将 pip 更新到当前最新版本。ensurepip
https://docs.python.org/2.7/library/ensurepip.html
PEP 477: Backport ensurepip(PEP 453) to Python 2.7
1.1.2 安装第三方包
用 pip install
命令可以安装第三方开发的包。
第三方包注册在 PyPI 上。这是一个用来共享 Python 包的版本库(Repository),任何人都可以将 Python 包上传到上面,同时也可以从上面自由下载想用的包。用 Python 开发软件时,常常要从 PyPI 安装所需的包。
NOTE
PyPI 的读音是 //'paɪˌpi: ai//。
PyPI 的构造类似 Perl 中的 CPAN1、Ruby 中的 RubyGems2、PHP 中的 PEAR3 等。
从 PyPI 安装包时需要用到 pip 命令。
NOTE
有关 pip 的详细内容我们将在第 3 章中详细了解。
这里简单了解一下 pip 的使用方法。首先我们来查看当前安装的 pip 的版本(LIST 1.4)。
LIST 1.4 查看 pip 的版本
$ pip --version
pip 1.5.6 from usrlocal/lib/python2.7/dist-packages/ (python 2.7)
可以看到当前版本为 1.5.6(2014 年 12 月 9 日时)。
NOTE
上面例子中的 pip 安装在 dist-packages 目录下,只有通过 debian 和 ubuntu 包安装 Python 时才会安装到这个特有的位置。如果是通过 Linux 发行版、OS X、源码安装,则会安装在 sitepackages 目录下。
通过 pip 安装第三方包的方法如下。首先我们来安装常用的 virtualenv 包(LIST 1.5)。
LIST 1.5 通过 pip 安装包
$ sudo pip install virtualenv
-(中间省略)-
Successfully installed virtualenv
Cleaning up...
此后,包的安装基本都要用 pip 命令来完成。另外,上面例子中的 virtualenv 包安装在 usrlocal/lib/python2.7 目录下。
NOTE
pip 在安装一些需要构建的包时,会用 gcc 等编译器进行构建。在本书所用的 Ubuntu 下,我们已经通过 build-essential 安装了 gcc。Windows 下需要用 Microsoft Visual C++ Compiler for Python 2.7 或者 MinGW 等进行安装。这些都是免费的。
1.1.3 virtualenv 的使用方法
前面安装的 virtualenv 是用来搭建虚拟 Python 执行环境的。我们将其称为 virtualenv 环境。使用这个环境时,包不会安装到 usrlocal/lib/python2.7 下,而是安装到虚拟 virtualenv 环境中。
由于我们在前面已经完成了安装,所以这里可以直接查看版本(LIST 1.6)。
LIST 1.6 查看 virtualenv 的版本
$ virtualenv --version
1.11.6
NOTE
有关 virtualenv 的详细内容我们将在第 3 章中详细了解。
我们在未使用 virtualenv 的状态下查看当前版本(LIST 1.7)。
LIST 1.7 用 pip freeze 查看当前安装版本
$ pip freeze
PAM==0.4.2
Twisted-Core==13.2.0
apt-xapian-index==0.45
argparse==1.2.1
configobj==4.7.2
:
:
输入 pip freeze
命令后,我们便能看到所有安装在 usrlocal/lib/python2.7 目录下的包。
接下来新建 virtualenv 环境。我们在主目录(HOME 目录)下创建工作目录,然后在这个工作目录下搭建 virtualenv 环境(LIST 1.8)。
LIST 1.8 搭建 virtualenv 环境
$ mkdir /work
$ cd /work
$ virtualenv venv
执行 LIST 1.8 中的命令后,work 目录下会自动生成 venv 目录。这就是 virtualenv 环境的目录。
接下来我们启动 virtualenv 环境。
LIST 1.9 启动 virtualenv 环境
$ source venv/bin/activate
(venv)$
如 LIST 1.9 所示,通过 source
命令执行 activate
,启动 virtualenv 环境。如果终端的开头显示了“(venv)
”(图 1.1),就证明 virtualenv 环境已经启动。
图 1.1 activate 后的 virtualenv 的状态
我们在启动了 virtualenv 的状态下再次执行 pip freeze
,查看当前已安装的包(LIST 1.10)。
LIST 1.10 在虚拟环境下查看版本
(venv) $ pip freeze
argparse==1.2.1
wsgiref==0.1.2
可以看到,在 virtualenv 环境刚刚搭建完成时,这个 Python 执行环境中没有添加安装任何包(argparse、wsgiref 是与 Python 本体捆绑的标准库)。
想关闭 virtualenv 环境时,输入 LIST 1.11 中的命令即可。
LIST 1.11 关闭 virtualenv 环境
(venv) $ deactivate
$
如果我们不再需要某个 virtualenv 环境(本例中是 venv 目录),则可以直接用 rm -R venv
等命令将其连同所在目录一起删除。
1.1.4 多版本 Python 的使用
目前,Python 3.X 系列和 2.X 系列的开发是并行的,因此我们会遇到不同项目使用不同版本的 Python 的情况。本小节中,我们将学习如何在一个客 OS 环境下准备多个版本的 Python,以满足不同应用的需要。
Ubuntu 14.04 默认安装了 Python 2.7.6 和 Python 3.4.0。
LIST 1.12 查看 Python 的版本
$ python3 -V
Python 3.4.0
$ python -V
Python 2.7.6
现在我们将 Python 2.7 系列的最新版本 Python 2.7.94 安装到客 OS(Ubuntu 14.04)上。
4http://www.python.org/downloads/release/python-279/
Ubuntu 14.04 上安装 Python 的方法有下列几种。
通过 Ubuntu 官方 deb 包安装
通过源文件构建安装
通过 PPA(Personal Package Archives,个人软件包档案)以 deb 包的形式安装
通过 deb 包的安装十分简便,但包中封装的不一定是最新版的 Python。某些版本的 Python 含有重要更新,这时候就需要我们通过源文件进行构建了。鉴于这类情况,我们将在这里介绍“通过源文件构建”这一安装方式(LIST 1.13)。
LIST 1.13 通过源文件构建并安装
$ wget https://www.python.org/ftp/python/2.7.9/Python2.7.9.tgz
$ tar xvzf Python2.7.9.tgz
$ cd Python2.7.9
$ LDFLAGS="-Lusrlib/x86_64-linux-gnu" ./configure --prefix=optpython2.7.9
$ make
$ sudo make install
该 Python 将被安装到 optpython2.7.9/bin 下,我们可以通过文件名中的版本号找到它。现在执行 Python 命令查看是否安装成功(LIST 1.14)。
LIST 1.14 查看 Python 2.7.9
$ optpython2.7.9/bin/python -V
Python 2.7.9
到这里,Python 的安装就结束了。接下来我们看看如何在开发应用时区分使用各个版本的 Python。
NOTE
像 Python 2.6 这种官方 apt 版本库早已不支持的旧版本,我们可以通过PPA,即分享个人软件包的 apt 版本库进行安装(LIST 1.15)。但要注意,PPA 中的软件包全都是个人上传的,一切使用后果要由自己负责。
LIST 1.15 通过 PPA 以 deb 包的形式安装
$ sudo add-apt-repository ppa:fkrull/deadsnakes
$ sudo apt-get -y update
$ sudo apt-get -y install python2.6
$ python2.6 -V
Python 2.6.9
NOTE
Python 的部分模块依赖于一些必须通过 apt 命令进行安装的包。对于这类 Python 模块,如果不事先用 apt 命令安装好包,则会发生 ImportError。
这种时候我们需要先用 apt 命令安装所需的包,然后再通过源文件进行构建。因此如果各位遇到 Python 模块无法使用的情况,可以考虑重新通过源文件构建一遍。有些 Python 的标准模块需要先安装 deb 包才能使用,具体内容如下所示。
Python 模块
deb 包
zlib
zlib1g-dev
sqlite3
libsqlite3-dev
readline
libreadline6-dev
gdbm
libgdbm-dev
bz2
libbz2-dev
Tkinter
tk-dev
◉ 借助 virtualenv 分别使用不同版本的 Python
当 OS 中安装了多个 Python 时,我们可以通过完整路径指定 Python 命令,或者使用带版本号的 Python 命令(如 python2.7
和 python3.4
)来区分使用各版本。
不过,如果在搭建 virtualenv 环境时指定了该环境下的默认 Python,那么在启动该环境时,我们就不需要顾虑版本问题了。
LIST 1.16 指定 virtualenv 下执行的 Python
$ virtualenv --python=optpython2.7.9/bin/python venv2
$ source venv2/bin/activate
(venv2)$
Python 2.7.9
根据 LIST 1.16 进行指定之后,以 optpython2.7.9/bin/python 为基础的 virtualenv 环境——venv2 就搭建完成了。
1.2 安装 Mercurial
版本控制系统在如今的开发过程中已经十分普及,Python 自然也不例外。人们使用版本控制系统通常是为了多人一起管理源码,不过,将它引入到个人开发中也能带来不少好处。比如在开发过程中应用突然不工作了,我们就可以将其回溯成能正常工作的版本。另外,对版本进行管理之后,一旦哪里发现了问题,我们可以立刻沿时间线查找之前的版本,快速找出问题发生的时间点。
版本控制系统大致可分为两类,一类是 CVS 和 Subversion 这种单一版本库的版本控制系统,另一种则是 Mercurial 和 Git 这种分布式版本控制系统(Distributed Version Control System,DVCS),如今越来越多人倾向于使用后者。Mercurial 这种分布式版本控制系统最大的优势在于各个版本库独立,因此在创建分支、提交、取消更改时不会对周围人造成影响。而且分布式的版本库可以各自看作是彼此的备份。
接下来我们来了解一下 Mercurial。
1.2.1 Mercurial 概述
Mercurial 是 Linux 内核的开发者 Matt Mackall 于 2005 年开始开发的分布式版本控制系统。Linux 内核之父 Linus Torvalds 也于同期开始开发 Git。如今这二者已经成为分布式版本控制系统的代表,被人们广泛使用。
由于 Mercurial 本身就是由 Python 编写而成的,因此我们可以轻松地通过 pip 进行安装,也可以将其视为 Python 程序进行自定义设置。
对熟悉 Python 的用户而言易于上手,与使用 Python 进行开发的团队亲和力高,这些都是 Mercurial 的优势所在。
此外,Mercurial 的魅力还在于内置了基于 Web 的管理工具,支持 Bitbucket5 等著名源码托管服务,TortoiseHg6 等 GUI 客户端丰富,等等。
6http://tortoisehg.bitbucket.org/
不仅如此,Mercurial 的命令体系与广为人知的 Subversion 很类似,对于长期使用 Subversion 的用户而言,要比 Git 更容易上手。
1.2.2 安装 Mercurial
单看前面的说明很难对分布式版本控制系统的优势有一个明确理解,所以现在我们通过实际的安装和操作来体会一下。另外,高级的 Mercurial 运用技巧我们将在第 6 章中进行学习,熟悉 Mercurial 的读者可以直接跳过本部分。
Mercurial 与其他程序包一样具有多种安装方法,用户可以通过 apt-get
、pip
、源文件构建等不同途径进行安装。这里我们为保证 Mercurial 尽量是最新版,决定选用 pip 进行安装(LIST 1.17)。
LIST 1.17 安装 Mercurial
$ sudo pip install mercurial
Mercurial 安装完成后我们就可以使用 hg 命令了。现在输入 hg --version
来查看版本(LIST 1.18)。
LIST 1.18 查看 Mercurial 的安装情况
$ hg --version
Mercurial Distributed SCM (version 3.1.2)
(see http://mercurial.selenic.com for more information)
Copyright (C) 2005-2014 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1.2.3 创建版本库
在创建版本库之前,我们先准备好 Mercurial 的环境设置文件。在主目录下创建名为 .hgrc 的文件,然后进行如下描述。其中括号内的部分称为节(Section),比如 [ui] 节就是用来设置 username 属性的。
username 中的账户信息会在用户向版本库进行提交时记录在日志中。各位请将自己的账户名和邮箱地址写在这里(LIST 1.19)。
LIST 1.19 设置 .hgrc 的用户名与邮箱地址
[ui]
username=bpbook <bpbook@beproud.jp>
[extensions]
color=
pager=
[pager]
pager=LESS='FSRX' less
[extensions] 节用来激活 Mercurial 附属的扩展工具。只要将扩展工具名写入 [extensions] 节的项目中,我们就可以使用该工具了。此外,某些扩展工具不仅要在 [extensions] 中设置激活,还需要在 [pager] 节中设置 pager 属性。
完成环境设置文件之后就该创建版本库了。如 LIST 1.20 所示,我们为版本库创建一个目录并移动至该目录下,执行 hg init
命令创建版本库。
LIST 1.20 hg init(初始化版本库)
$ mkdir /hgtest
$ cd /hgtest
$ hg init
1.2.4 文件操作
创建好版本库之后让我们给它实际添加文件。现在创建一个测试用的文件,查看当前版本库的状态。
查看版本库状态用 hg status
命令(LIST 1.21)。如果觉得每次输入 status
太麻烦,可以将这个命令缩写为 hg st
。hg 命令为用户准备了部分缩写形式,感兴趣的读者可以参考帮助或其他资料。
LIST 1.21 hg status(查看状态)
$ touch test.txt
$ hg status
? test.txt
文件名左侧显示了该文件在版本库内的状态。各位可以看到 text.txt 文件的左侧显示了状态“?
”,这代表该文件现在并不在版本管理的范围内。因此我们执行 hg add
命令将其添加为版本管理的对象,如 LIST 1.22 所示。
LIST 1.22 hg add(添加文件)
$ hg add test.txt
$ hg status
A test.txt
执行 hg add
之后我们再进行一次查看,会发现之前的“?
”已经变成了“A
”。这代表该文件是新添加到版本管理里的。
要想让添加文件反映到版本库,我们需要进行提交。提交时请按照 LIST 1.23 所示,输入 hg commit
命令。如果不执行 hg commit
,那么我们创建的文件就只能停留在当前工作的机器里,不会反映到版本库中。
LIST 1.23 hg commit(提交)
$ hg commit
test commit
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: bpbook <bpbook@beproud.jp>
HG: branch 'default'
HG: added test.txt
执行 hg commit
后编辑器就会启动,用来记录提交时的相关信息与注释。我们在这里输入 test commit
。
注释输入栏下方显示着 branch 'default'
,这表示 default 分支(版本库创建时就存在的分支)为我们当前进行修正 / 添加操作的对象。
NOTE
提交时打开的编辑器是可以更改的。更改时需要如下例所示,在 .hgrc 的 [ui] 节里添加 editor 属性。
[ui]
editor = vim
这表示我们要使用vim 编辑器。默认启动的编辑器取决于环境变量EDITOR,环境变量可以用下述命令查看。
$ echo $EDITOR
vim
提交文件之后用 hg status
查看,结果应该如 LIST 1.24 所示,什么都没有。
LIST 1.24 提交后的查看
$ hg status
接下来我们看看如何在 Mercurial 中操作编辑过的文件。
先用编辑器打开 test.txt 进行修改,然后保存文件。在当前状态下执行 hg status
后,会发现该文件的状态变成了 M
。状态 M 表示该文件在最后一次提交之后又进行了“变更”(Modify)。使用 hg diff
命令可以查看变更前的状态(已提交的文件)与当前状态的差别(LIST 1.25)。
LIST 1.25 hg diff(查看差别)
$ hg status
M test.txt
$ hg diff
diff -r 74471564b074 test.txt
--- a/test.txt Mon Oct 31 18:07:15 2014 +0900
+++ b/test.txt Mon Oct 31 18:10:45 2014 +0900
@@ -0,0 +1,1 @@
+modify this file
在尚未提交的状态下,我们可以使用 hg revert
命令撤销编辑(LIST 1.26)。
LIST 1.26 hg revert(撤销编辑)
$ hg revert test.txt
NOTE
hg revent
可以撤销尚未提交的内容,但对已提交的内容无效。这种情况需要使用hg commit --amend
命令对已提交的变更集进行修改或撤销。
Mercurial 的基本操作方法就解说到这里,但下列几项我们并未提及。
分支的操作
远程版本库的使用
以团队开发为前提的 Mercurial 的使用方法
上述几点我们将在第 4 章和第 6 章中详细了解。
1.3 编辑器与辅助开发工具
本节将介绍编写 Python 代码时可用的编辑器,以及一些有助于开发的小贴士和 Python 模块。
1.3.1 编辑器
编写 Python 代码自然少不了编辑器。当今世上的编辑器种类繁多,但编写 Python 代码的编辑器必须具备下列几项功能。
- 语法高亮
将语法设置高亮是一项十分重要的功能。用特殊字色或字体表示关键词可以让编程人员快速发现拼写类错误。这样一来,我们便能够在编写代码的过程中注意并修正此类错误。
- 智能缩进
自动根据语法添加缩进的功能。特别是对于Python这类缩进具有重要意义的语言,编辑器适时地自动缩进要比手动插入空格时的编程效率高得多。
- 执行 DEBUG
在编辑器上执行DEBUG的功能。比如在编程过程中遇到某些问题时,如果能直接使用编辑器进行DEBUG,那么将能更快地找出原因,提高解决问题的效率。
- 可以使用静态解析类插件
能在编辑器上执行静态解析类插件的功能。如果能直接在编辑器内执行语法高亮无法查出的键入错误、语法错误、编码格式检查等,将能省去每次开关编辑器的麻烦,大幅削减修改时消耗的时间。
这里将按照上述 4 点,给各位介绍 3 个编辑器(Vim、Emacs、PyCharm)的使用方法和功能。
各位可以以此为参考来寻找自己用着顺手的编辑器。
◉ Vim
Vim 是一款功能强大的文本编辑器,默认搭载在许多 OS 上,普及度很高。
Vim 可以通过内置的 Vim script 脚本语言进行功能扩展,因此存在许多插件。
- 语法高亮
默认捆绑Python的语法高亮设置文件(python.vim)。
- 智能缩进
有自动缩进的设置选项。缩进时插入的空格数也可以调节。
- 执行 DEBUG
Vim可以在编辑器上调出外部命令,因此可以执行pdb
(后述)。比如执行:!pathto/virtualenv/python -m pdb %
之后,编辑器便会对编辑中的脚本启动调试工具。
- 可以使用静态解析类插件
vim-flake8插件可以检查当前打开的文件并发出问题警告。
Vim 的设置在主目录“.vimrc
”文件中进行,我们写在该文件中的设置将反映在 Vim 上。
现在我们来设置语法高亮和自动缩进(LIST 1.27)。
LIST 1.27 用于 Python 的设置
" 语法高亮的设置
syntax on
" 自动缩进的设置
filetype plugin indent on
另外,设置文件本身也可以根据对象文件类型进行分割。下面,我们专门为 Python 脚本准备一个设置文件(LIST 1.28)。
LIST 1.28 准备 Python 专用的设置文件
$ mkdir /.vim
$ mkdir /.vim/ftplugin
$ touch ~/.vim/ftplugin/python.vim
我们在这个 python.vim 中进行针对 Python 的设置,以方便编写 Python 代码。
LIST 1.29 将 Tab 改为 4 个空格
" 将“Tab”替换为“空格”
setl expandtab
" 将“Tab”的“缩进幅度”改为4
setl tabstop=4
" 自动缩进时的“缩进幅度”改为4
setl shiftwidth=4
" 按下键盘“Tab”键时插入的空格数
" 这里设置为0 就可以插入“tabstop”中设置的空格数了
setl softtabstop=0
" 保存时删除行尾的空格
autocmd BufWritePre * :%s/\s\+$//ge
"80 个字符换行
setlocal textwidth=80
像 LIST 1.29 这样设置是为了迎合 Python 社区推荐的 PEP 87 编码格式(后述)。
7https://www.python.orgdevpeps/pep-0008
vim-flake8 是 Vim 的插件,需要进行安装。neobundle.vim8 是一个专门用来管理 Vim 插件的插件,用它可以轻松安装其他 Vim 插件。
8https://github.com/Shougo/neobundle.vim
安装 neobundle.vim 后,我们在“.vimrc”里这样设置 vim-flake8。
NeoBundle 'nvie/vim-flake8'
现在只要重启 Vim 就会开始安装插件。安装结束后,用 Vim 打开 Python 脚本,按下 Ctrl + F7 就可以看到 flake8 的警告信息了。
NOTE
python.org 官方 Wiki 上也记载着 Vim 的一些设置资料,各位不妨去看一看。
· Vi Improved9
此外,在Vim 官方网站和许多民间社区中都能找到大量关于Vim 的信息。
· Vim online10
· vim-jp11
9https://wiki.python.org/moin/Vim
◉ Emacs
Emacs 是 Unix 系列 OS 长期沿用的编辑器。该编辑器可以用 Emacs Lisp 语言进行扩展,因此拥有大量插件。如今的 Emacs 已经捆绑了 python.el,安装 Emacs 之后可以直接编写 Python 代码,不必特意去设置。
人们常说 Emacs 是一个环境,不过我们在这里主要是看它作为 Python 编辑器的特征。
- 语法高亮
内置python.el。当global-font-lock-mode
不为nil
时(默认)进行语法高亮。
- 智能缩进
python.el会按照PEP 8的要求缩进到指定位置。
- 执行 DEBUG
Emacs上可以执行pdb
。
先键入M-x pdb
,然后直接在minibuffer里运行类似pathto/virtualenv/ python -m pdb pathto/app.py
的pdb命令行。此时会启动pdb专用的缓冲,我们可以在里面查看源码或进行调试。
- 可以使用静态解析类插件
flymake-python-pyflakes
可以在编码过程中高亮警告。
安装完成之后我们在设置文件$HOME/.emacs.d/init.el 中设置 Tab 和空格的执行动作。另外,Emacs 可以让空格和 Tab 文字可视化。在 Python 中,缩进是语法的一部分,所以建议各位先将这些设置好(LIST 1.30)。
LIST 1.30 空格和 Tab 的设置
(require 'whitespace)
(setq whitespace-style '(face tabs tab-mark spaces lines-tail empty))
(global-whitespace-mode 1)
(setq-default tab-width 4 indent-tabs-mode nil)
(setq indent-tabs-mode nil)
flymake-python-pyflakes 等插件并没有捆绑在 Emacs 中,所以我们需要通过 Emacs 的版本控制系统 elpa 进行安装。首先在 $HOME/.emacs.d/init.el 文件中进行如 LIST 1.31 所示的设置。
LIST 1.31 elpa 的程序包版本库设置
(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives
'("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)
通过 elpa 安装好 flymake 和 flymake-python-pyflakes 之后,我们再进行 LIST 1.32 所示的设置。
LIST 1.32 flymake 的设置
(require 'flymake)
(require 'flymake-python-pyflakes)
(add-hook 'python-mode-hook 'flymake-python-pyflakes-load)
(setq flymake-python-pyflakes-executable "flake8")
设置好 flymake,我们编写源码时就能在 Emacs 上看到 flake8 的警告了。
NOTE
python.org 上有设置Emacs 的相关资料。
· Emacs Editor12
另外,我们在其官方网站和许多Wiki 上也能找到大量Emacs 的信息。
· GNU Emacs13 · EmacsWiki14 / · Python Programming In Emacs15
12https://wiki.python.org/moin/EmacsEditor
13http://www.gnu.org/software/emacs/emacs.html
15http://www.emacswiki.org/emacs/PythonProgrammingInEmacs
◉ PyCharm
对长期以来使用 Eclipse 等 IDE(Integrated Development Environment,集成开发环境)进行开发的人来说,IDE 用起来要比编辑器顺手得多。在当今众多的 IDE 中,普及率较高的当属 PyCharm16 了。
16http://www.jetbrains.com/pycharm/
PyCharm 是一款 2010 年左右问世的 IDE,为 Windows、OS X、Linux 等 OS 提供了相应的安装程序,同时还支持 Python 的 Web 框架 Django。PyCharm 有多种许可证形态,比如付费的 Pro 版和免费的 Community 版等。其中付费的 Pro 版还提供 30 天的免费使用期。
与 Vim 和 Emacs 相比,PyCharm 自带了许多 Python 开发的辅助功能,在安装完之后可以立刻使用。相对地,自行开发插件则需要应用 Java 的知识,所以并不算容易。从这种角度来讲,这款工具可能并不适合极客们使用。
如果各位实在无法适应 Vim 或 Emacs,那么建议先尝试 PyCharm 的 Community 版。它作为编写 Python 时使用的 IDE,具有以下特征。
- 语法高亮
标准功能。PyCharm会根据当前项目使用的Python版本切换语法及内置函数等文字的高亮效果。
PyCharm标准支持Python、HTML、CSS、JavaScript、XML、SQL以及CoffeeScript、Angular JS、LESS、SASS、SCSS等格式的高亮显示。Pro版还支持Django、Mako、Jinja2、Web2py、Chameleon模板的记法。
- 智能缩进
标准功能。PyCharm会按照PEP 8的要求缩进到指定位置。
与语法高亮相同,PyCharm也支持Python以外的其他格式。另外,用户还可以对各个项目的各个语言进行详细设置,比如规定插入Hard Tab还是空格等。
- 执行 DEBUG
标准功能。IDE中可以设置断点、逐句执行、显示执行中的变量值。Pro版可以用手边终端的IDE调试远程服务器上的进程。
- 静态解析类功能
标准功能。在编写代码的过程中,PyCharm会高亮显示对未使用的变量、未定义的名称、已过期函数的警告等。另外,PyCharm在执行解析功能时会从多角度分析Python代码是否存在风险。
导入 PyCharm 之后,我们就可以不再为搭建环境劳神费心了。它为用户标配了大量功能,大部分人都可以在默认设置的状态下轻松使用。不过相对地,一旦习惯了这些懒办法,当极客的乐趣自然也会大打折扣。
PyCharm 也并不适用于所有情况,比如编辑单个文件就很麻烦。这种情况需要先创建一个空项目,把待编辑的文件加入项目之后才能打开编辑。另外,PyCharm 的使用环境建议内存为 2 GB 以上,显示器为 SXGA 以上。
专栏 PyCharm 适合用来干什么
PyCharm3 及之前的版本以提供面向 Web 开发者的辅助功能为主。从 2014 年 11 月发布的 PyCharm4 开始,该系列 IDE 开始内置 IPython notebook 等功能,预计今后会逐步增添科学计算相关的辅助功能。
1.3.2 开发辅助工具
本部分将向各位介绍一些 Python 开发过程中应当了解的模式及 Python 包。
◉ 交互模式
单独执行 python
命令时,该命令会以交互模式执行。交互模式指通过对话方式输入并执行 Python 代码的模式。现在请直接输入 python
命令(LIST 1.33)。
LIST 1.33 启动交互模式
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
随后系统会进入等待输入的状态。我们可以在这个状态下直接编写 Python 代码。代码执行后的内容会直接显示在屏幕上(LIST 1.34)。
LIST 1.34 Python 代码执行示例
- >>> import sys
- >>> sys.path
- ['', 'usrlib/python2.7', 'usrlib/python2.7/plat-x86_64-linux-gnu',
- 'usrlib/python2.7/lib-tk', 'usrlib/python2.7/lib-old',
- 'usrlib/python2.7/lib-dynload', 'usrlocal/lib/python2.7/dist-packages',
- 'usrlib/python2.7/dist-packages']
- >>>
我们导入了标准模块 sys 并显示了 Python 包的搜索路径列表。
最后一次执行的结果存储在变量“_
”中,执行它就可以返回相同结果。交互模式让我们能随手轻松地查看代码,方便进行 DEBUG 等操作。如果想结束交互模式,可以按 Ctrl + d 或输入 exit()
。
NOTE
交互模式在启动时会读取环境变量 PYTHONSTARTUP 中设置的文件。如果各位在启动交互模式时想顺便导入些什么,可以在这里进行设置。
另外,IPython 模块可以将 Python 的交互模式用作调试器。该模块可通过 pip 安装。
$ sudo pip install ipython
导入IPython 后,交互模式会实现下述功能。
· TAB 键补全代码
· 使用通常的 Shell 命令
· 与pdb(调试器)联动
◉ flake8(编码格式 / 语法检测)
为更好地规范和优化 Python,人们以社区为中心给 Python 制定了 PEP(Python Enhancement Proposals,Python 增强建议书)17 指导规范。
17https://www.python.orgdevpeps
其中 PEP 8 主要规范 Python 的编码格式。这里即将介绍的 flake8 模块就可以检查我们的代码是否符合该编码格式。如 LIST 1.35 所示,flake8 可通过 pip 安装。
LIST 1.35 安装 flake8
$ sudo pip install flake8
flake8 不但能检查编码格式,还可以帮助我们找出语法错误以及一些已导入但未被使用的模块并发出警告。
使用方法很简单,只要像 LIST 1.36 一样指定文件并执行 flake8 命令即可。
LIST 1.36 flake8 执行示例
$ flake8 sample.py
sample.py:1:12: E401 multiple imports on one line
sample.py:1:17: E703 statement ends with a semicolon
sample.py:3:1: E302 expected 2 blank lines, found 1
sample.py:4:5: E265 block comment should start with '# '
sample.py:4:80: E501 line too long (83 > 79 characters)
sample.py:5:15: E225 missing whitespace around operator
NOTE
由于我们平时使用的是 flake8,所以这里只对它进行了介绍。该类常用的程序包还有 PyLint 等,各位可以根据自己的开发风格选用合适的模块。
◉ pdb(调试器)
最后我们来了解一下 Python 的调试器。如果各位曾经用过 C 语言的 gdb 等调试器,或者对 IDE 等上面附属的调试器有所接触,那么一定不会对插入断点、逐句执行等功能感到陌生。 Python 的调试器也具备这些功能。
pdb 是 Python 的标准模块,不必另外安装。其最简单的用法就是在我们希望程序停止的位置插入如 LIST 1.37 所示的代码。
LIST 1.37 pdb 的插入代码
def add(x, y):
return x + y
x = 0
import pdb; pdb.set_trace()
x = add(1, 2)
执行这个插入了 LIST 1.37 中的代码的 Python 脚本时,脚本会停在上述插入代码的位置,然后启动对话型界面。
LIST 1.38 pdb 执行示例
$ python pdbtest.py
> pdbtest.py(7)<module>()
-> x = add(1, 2)
(Pdb)
本节我们对一些辅助开发的工具、Python 程序包等作了了解。由于涉及范围较广,我们只简单学习了部分使用方法。有关这些工具、程序库的详细信息请各位自行查阅相关文档。
1.4 小结
本章对下列话题进行了介绍,意在指导各位完成 Python 语言独立开发的事前准备。
安装 Python
安装 Mercurial
编辑器和 DEBUG 工具
为保证开发前的准备工作,本章介绍了许多工具的安装方法。这里介绍的很多内容在 Ubuntu 以外的 OS 上同样适用。此外,各位还可以编写自动完成安装的 Shell 脚本,或者省略并简化本书介绍的步骤等,总之能做的事情还有很多。各位请根据自己的需要搭建适合自己的环境。
NOTE
进入第 2 章之前,我们先来看一下 The Zen of Python。The Zen of Python 是 Python 开发者之一 Tim Peters 撰写的文章,通过 19 个分项简明扼要地表达了 Python 的特点。The Zen of Python 现已作为 PEP 2018 公开发表,在交互模式下输入 import this 命令也可以看到这篇文章。我们强烈建议各位去读一读。
>>> import this
另外,@atsuoishimoto 在博客上对The Zen of Python 进行了详细讲解,各位不妨参考一下。
· The Zen of Python 解题 - 前篇19(日语)
· The Zen of Python 解题 - 后篇20(日语)
18https://www.python.orgdevpeps/pep-0020