附录 D 高级 Python 设置
在本书的前文中,我们创建了系统 Python。为什么呢?因为它使用起来快速简单。在开始使用更加复杂的库和工具时,你可能会需要一个更加高级的设置。机器上高级的 Python 设置在你组织项目时是很有帮助的。在你需要同时运行 Python 2.7 和 Python 3+ 时,一个高级设置也很有帮助。
在本附录中,我们会带你用专家模式设置 Python 环境。因为这里涉及很多依赖,所以指南中的部分内容与你的经验不符是完全有可能的。为了解决这些问题,我们建议你去互联网寻找或询问如何继续。
我们会首先安装一些核心工具,之后安装 Python(2.7,但是你也可以安装 3+)。最后,我们会安装和设置一些虚拟环境,独立出项目,这样你可以对每一个项目使用不同版本的 Python 库。
本附录中的指南覆盖 Mac、Windows 和 Linux。随着你阅读每一个步骤,仔细跟随你的特定操作系统的指令。
D.1 第1步:安装GCC
GCC(GNU Compiler Collection,GNU 编译器集合)的目的是将用 Python 编写的代码转换为机器可以理解的东西——字节码。
在 Mac 上,GCC 包含在 Xcode(https://developer.apple.com/xcode/)和命令行工具(https://developer.apple.com/downloads/)中。你需要下载其中的任意一个。但是对于这两个方式,你都会需要一个 Apple ID(http://bit.ly/create_appleid)用于下载。同样,Xcode 需要花费一些时间从互联网上下载(我下载了 20 分钟),所以可以计划休息一下。如果你关心时间或内存的使用,选择命令行工具取代 Xcode。安装 Xcode 或命令行工具不会花费太长的时间。在继续安装 Homebrew 之前,确保 Xcode 或命令行工具已经安装。
如果你正在使用 Windows,Jeff Preshing 写了一个关于安装 GCC 的很有帮助的教程(http://preshing.com/20141108/how-to-install-the-latest-gcc-on-windows/)。如果你正在使用 Linux,GCC 安装在绝大多数基于 Debian 的操作系统上,或者你可以通过运行 sudo ap-get install build-essential
安装它。
D.2 第2步:(只在Mac上)安装Homebrew
Homebrew 管理 Mac 系统上的包,这意味着你可以输入命令,Homebrew 会在安装中帮助你。
安装 Homebrew 之前,确保已经安装 Xcode 或命令行工具。否则,你会在安装 Homebrew 时遇到错误。
为了安装 Homebrew,打开控制台,输入这行代码(跟随任何出现的提示,包括请求允许安装 Homebrew 的权限):
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
注意命令的输出。Homebrew 建议运行 brew doctor
检查并对任何安装中的问题给出警告。根据你系统状态的不同,你可能有很多需要追查的问题。如果你没有收到警告,那么继续下一个步骤。
D.3 第3步:(Mac系统)告诉系统去哪里寻找 Homebrew
为了使用 Homebrew,你需要告诉系统它位于哪里。为此,添加 Homebrew 到 .bashrc 文件,或者你正在使用的其他 shell(即,如果你有一个自定义的 shell,需要在这里添加它)。.bashrc 文件可能在系统中还不存在;如果它存在的话,会隐藏在 home 目录里。
在你输入 ls
命令时,所有文件名以一个“.”开始的文件是不会显示的,除非你明确地请求显示所有文件。这一做法的目的有两面性。首先,如果文件是不可见的,你就更不可能错误地删除或编辑它们。其次,这些文件类型并不经常使用,所以隐藏它们使得系统外观更清晰。
让我们看一下,在通过给 ls
命令添加额外的命令,展示所有的文件后,我们目录的样子。确保你正位于 home 目录中,然后输入下面的命令:
$ ls -ag
你的输出会看起来类似于:
total 56
drwxr-xr-x+ 17 staff 578 Jun 22 00:08 .
drwxr-xr-x 5 admin 170 May 29 09:49 ..
-rw------- 1 staff 3 May 29 09:49 .CFUserTextEncoding
-rw-r--r--@ 1 staff 12292 May 29 09:44 .DS_Store
drwx------ 8 staff 272 Jun 10 00:45 .Trash
-rw------- 1 staff 389 Jun 22 00:07 .bash_history
drwx------ 4 staff 136 Jun 10 00:35 Applications
drwx------+ 5 staff 170 Jun 22 00:08 Desktop
drwx------+ 3 staff 102 May 29 09:49 Documents
drwx------+ 10 staff 340 Jun 11 23:47 Downloads
drwx------@ 43 staff 1462 Jun 10 00:29 Library
drwx------+ 3 staff 102 May 29 09:49 Movies
drwx------+ 3 staff 102 May 29 09:49 Music
drwx------+ 3 staff 102 May 29 09:49 Pictures
drwxr-xr-x+ 5 staff 170 May 29 09:49 Public
我们没有 .bashrc 文件,所以需要创建一个。
如果你有 .bashrc 文件,需要备份一个,以防发生任何问题。通过命令行创建一个 .bashrc 的副本非常简单。直接运行下面的命令来复制 .bashrc 到一个新的文件,.bashrc_bkup:
$ cp .bashrc .bashrc_bkup
为了创建一个 .bashrc 文件,首先需要确认我们拥有一个 .bash_profile 文件。如果我们添加了一个 .bashrc 文件,而没有 .bash_profile,计算机不会知道拿这个文件做什么。
在开始之前,先检查一下我们是否有 .bash_profile 文件。如果有,它会出现在 ls -ag
命令产生的目录列表中。如果没有的话,那么你需要创建它。
如果你有一个 .bash_profile 文件,需要将它备份,这样如果有任何问题,可以恢复至原始的设置。运行下面的命令来复制 .bash_profile 到一个新的文件,名为 .bash_bkup:
$ cp /.bash_profile /.bash_profile_bkup
之后运行这个命令来复制它到桌面,同时重新命名它:
$ cp /.bash_profile /Desktop/bash_profile
如果你正在使用一个已存在的 .bash_profile 文件,启动编辑器,打开你复制到桌面的那个版本的文件。添加下面的代码到文件末尾。这段代码的意思是“如果这里存在一个 .bashrc 文件,那么使用它”。
# Get the aliases and functions
if [ -f /.bashrc ]; then
. /.bashrc
fi
如果还没有 .bash_profile 文件,你需要在编辑器中用这些内容创建一个新文件。保存文件到桌面,命名为 bash_profile,开头没有句号。
确保你检查了 home 目录下不存在 .bash_profile 和 .bashrc 文件。如果它们存在的话,确保跟随指引在继续之前创建原始文件的备份。如果没有做这些的话,当执行下面的命令时,你可能重写原始文件,这可能引发问题。
现在回到控制台,运行下面的命令来重命名文件,并且从桌面移动到 home 目录:
$ mv ~/Desktop/bash_profile .bash_profile
现在,如果运行 ls -al ~/
,你会在 home 目录中看到一个 .bash_profile 文件。如果执行 more .bash_profile
,你会看到代码调用了 .bashrc。
现在有了一个 .bashrc_profile 文件,引用 .bashrc 文件,让我们编辑 .bashrc 文件。首先在文本编辑器中打开当前的 .bashrc 文件或一个新文件。添加下面的代码到 .bashrc 文件的末尾。这会在设置中添加 Homebrew 的位置到你的$PATH
变量。新的 path 会比老的$PATH
优先级更高:
export PATH=usrlocal/bin:usrlocal/sbin:$PATH
现在,保存这个文件到桌面,命名为 bashrc,没有句号。
为你的代码编辑器使用命令行快捷键
我们在 .bashrc 文件中更新设置时,创建一个快捷方式来从命令行工具启动代码编辑器。这不是必需的,但是会使浏览文件目录和在代码编辑器中打开文件更简单。使用你的 GUI 来浏览文件不会像这样有效。
如果你正在使用Atom,在安装了 Atom 后,你已经有了可用的快捷方式和 shell 命令(https://discuss.atom.io/t/openfile-project-from-terminal-command-line/1305)。Sublime 同样有在OS X 上可用的命令(https://www.sublimetext.com/docs/2/osx_command_line.html)。
如果正在使用其他的代码编辑器,你可以尝试输入程序名称来看它是否启动,或者输入程序名和
--help
来看它是否具有命令行帮助。我们同样建议搜索“< 你的程序名称 >命令行工具”,来看是否有任何有帮助的结果。
回到控制台,运行下面的命令来重命名文件,并且将它们从桌面移动到你的 home 目录:
$ mv ~/Desktop/bashrc .bashrc
这时,如果你运行 ls -al ~/
,你会看到 home 目录中有 .bashrc 文件和一个 .bash_profile 文件。让我们通过在控制台中打开一个新的窗口来检验 $PATH
变量。为了检验这个变量,运行下面的命令:
$ echo $PATH
你会得到像下面这样的输出:
usrlocal/bin:usrlocal/sbin:usrbin:/bin:usrsbin:/sbin:usrlocal/bin
无论输出是什么,你会看到变量的信息(usrlocal/bin:usrlocal/sbin
)添加到了我们的 .bashrc 文件中,突出了返回值。
如果你没有在变量中看到新的值,确保你打开了一个新的窗口。设置的改变不会加载到当前的终端窗口,除非你明确地应用文件到当前的终端[查看 bash source(http://ss64.com/bash/source.html)命令获取更多的信息]。
D.4 第4步:安装Python 2.7
为了在 Mac 上安装 Python 2.7,运行下面的命令:
$ brew install python
如果你想要跟进 Python 3+,你可以安装它。在 Mac 上安装 Python 3+,运行:
$ brew install python3
对于 Windows,你需要跟随第 1 章中的指引,正确地通过 Windows 安装程序安装。对于 Linux,很可能你已经安装了 Python。在 Linux 中,通过安装一些 Python 开发者包(http://stackoverflow.com/questions/6230444/how-to-install-python-developer-package)来安装一些额外的工具是好的想法。
在完成所有的操作后,测试它是否工作正常。
在终端启动你的 Python 解释器:
$ python
然后,运行下面的代码:
import sys
import pprint
pprint.pprint(sys.path)
Mac 输出看起来类似这样:
>>> pprint.pprint(sys.path)
['',
'usrlocal/lib/python2.7/site-packages/setuptools-4.0.1-py2.7.egg',
'usrlocal/lib/python2.7/site-packages/pip-1.5.6-py2.7.egg',
'usrlocal/Cellar/python/2.7.7_1/Frameworks/Python.framework/Versions/
2.7/lib/python27.zip',
'usrlocal/Cellar/python/2.7.7_1/Frameworks/Python.framework/Versions/
2.7/lib/python2.7',
'LibraryPython/2.7/site-packages',
'usrlocal/lib/python2.7/site-packages']
如果正在使用 Mac,你收到的输出应该有很多以 usrlocal/Cellar/ 开头的文件路径。如果没有看见它,你可能没有在控制台窗口重新加载设置。关闭窗口,再打开一个新的窗口,重新尝试一次。如果这没有解决过程中出现的任何问题,返回到设置的最开始,重新执行步骤。
调试安装错误是一个学习与积累经验的过程。如果你遇到了在本节中没有描述的错误,在浏览器中打开你最喜欢的搜索引擎,搜索这个错误。你可能不是第一个经历该问题的人。如果你成功完成了本节内容,请继续下一步。
D.5 第5步:安装virtualenv
(Windows、Mac、Linux)
我们已经设置了第二个 Python 实例,但是现在我们想要设置一种创建独立的 Python 环境的方式。通过隔离不同的项目和依赖,virtualenv
可以帮助我们达到这个目的。如果有多个项目,我们可以确保每个需求间没有冲突。
为了安装 virtualenv
,我们需要 Setuptools(http://pythonhosted.org//setuptools/)。安装完 Python,Setuptools 也就跟着安装了。Setuptools 的一部分是名为 pip 的命令行工具,我们使用它来安装 Python 包。
为了安装 virtualenv
(http://virtualenv.readthedocs.org/en/latest/),在命令行中运行下面的命令:
$ pip install virtualenv
在运行这个命令后,输出的一部分应该为:Successfully installed virtualenv。如果你得到这个信息,那么所有事情运行良好。如果没有,那么你有其他需要解决的问题,可以在网络上搜索,寻求帮助。
D.6 第6步:创建一个新目录
在继续之前,让我们创建一个目录,来维护项目相关的内容。根据个人喜好确定位置。为便于访问和备份,大多数人在用户 home 目录中创建文件夹。你可以将目录放在任何你喜欢的既有用又好记的地方。在 Mac 系统上,要在 home 目录中创建一个 Projects 文件夹,可在终端运行下面的命令:
$ mkdir ~/Projects/
或者对于 Windows:
> mkdir C:\Users\_your_name_\Projects
之后在该文件夹中创建一个文件夹,来保存我们编写的数据处理代码。在 Mac 上,你可以通过运行下面的命令达到这个目的:
$ mkdir ~/Projects/data_wrangling
$ mkdir ~/Projects/data_wrangling/code
对于 Windows,使用下面的代码:
> mkdir C:\Users\_your_name_\Projects\data_wrangling
> mkdir C:\Users\_your_name_\Projects\data_wrangling\code
最后,在 home 目录中添加一个隐藏文件夹,在 virtualenv
环境中使用。在 Mac 上使用下面的命令:
$ mkdir ~/.envs
对于 Windows 运行下面的命令 :
> mkdir C:\Users\_your_name_\Envs
如果你想要在 Windows 中隐藏文件夹,可以通过在命令行中编辑属性做到:
> attrib +s +h C:\Users\_your_name_\Envs
要取消隐藏,可以直接去除属性:
> attrib -s -h C:\Users\_your_name_\Envs
这时,如果我们查看 Projects 文件夹的内容,应该会看到两个空的子文件夹,名为 code 和 envs。
D.7 第7步:安装virtualenvwrapper
virtualenv
是一个很棒的工具,但是 virtualenvwrapper
(http://virtualenvwrapper.readthedocs.org/en/latest/)让 virtualenv
更易于访问和使用。然而它有很多特性(https://virtualenvwrapper.readthedocs.io/en/latest/#features)没有在这个附录中提到,其中最强大的特性也是最简单的特性之一。
它需要一个类似下面的命令:
source $PATH_TO_ENVS/example/bin/activate
将其变成这样:
workon example
D.7.1 安装virtualenvwrapper
(Mac和Linux)
在 Mac 和 Linux 上安装 virtualenvwrapper
,运行下面的命令:
$ pip install virtualenvwrapper
检查输出的倒数第二行,确保所有的安装正确。对我来说,这行代码的意思是成功地安装了 virtualenvwrapper virtualenv-clone stevedore。
更新你的.bashrc
你同样需要添加一些设置到 .bashrc 文件中。我们会复制文件,编辑它,然后将它放回原来的位置。
首先,创建一个 .bashrc 文件的备份。如果已经有了一份,你可以跳过这个步骤。如果你从一个新文件开始,你会创建 .bashrc 文件的第一个备份。为了完成这件事,输入下面的命令:
$ cp /.bashrc /.bashrc_bkup
我在 GitHub 上存储了设置文件(https://github.com/jackiekazil/dotfiles),这样我总是有一个可用的备份。在我犯了错误或者计算机死机的时候,我总是可以恢复它。当你不断调整文件,产生 20 个备份时,确保 home 文件夹不会产生混乱。你很少会编辑 .bashrc 文件,但是在编辑这类文件之前,要备份它们。
使用编辑器打开 .bashrc 文件,在文件末尾添加下面三行代码。如果你没有为 Projects 文件夹使用相同的位置,你需要相应地调整文件的路径:
export WORKON_HOME=$HOME/.envs ➊
export PROJECT_HOME=$HOME/Projects/ ➋
source usrlocal/bin/virtualenvwrapper.sh ➌
❶ 定义 WORKON_HOME
变量。这是存储 Python 环境变量的地方。这应该与你之前创建的环境文件夹匹配。
❷ 定义 PROJECT_HOME
变量。这是你存储代码的地方。这应该与你之前创建的 Projects(或 linux 项目)文件夹匹配。
❸ 初始化 virtualenvwrapper
,它让 virtualenv
更容易使用。
完成后,保存文件并打开一个新的终端窗口来加载新的设置。现在你就有了一个易于使用的带有虚拟环境的命令集。
D.7.2 安装virtualenvwrapper-win
(Windows)
对于 Windows 系统,有一些额外的可选步骤会让你更轻松。首先,你需要安装 Windows 版本的 virtualenvwrapper
(https://pypi.python.orgpypivirtualenvwrapper-win)。你同样可以通过运行下面的命令完成这件事:
>pip install virtualenvwrapper-win
你同样需要添加 WORKON_HOME
环境变量。默认情况下,virtualenvwrapper
会希望你在 User 文件夹下有一个名为 Env 的文件夹。如果你想要为虚拟环境设置自己的文件夹,那就设置吧,然后添加 WORKON_HOME
变量,设置为合适的文件路径。如果你在之前没有设置过环境变量,需要一个快速的指南,在 Stack Overflow 上有一个很棒的教程(https://superuser.com/questions/284342/what-are-path-and-other-environment-variables-and-how-can-i-set-or-use-them)。
为了在 Windows 上与多个版本的 Python 一起工作,安装
pywin
(https://github.com/davidmarble/pywin)也是一个很好的想法;这便于你在不同版本的 Python 间切换。
D.7.3 测试你的虚拟环境(Windows、Mac、Linux)
在圆满完成这一节之前,让我们运行一些测试程序来确保一切正常工作。在一个新的控制台窗口中,创建一个新的虚拟环境,名为 test:
mkvirtualenv test
你的输出应该看起来类似这样:
New python executable in test/bin/python2.7
Not overwriting existing python script test/bin/python (you must use
test/bin/python2.7)
Installing setuptools, pip...done.
如果你想要使用 Python 3+ 创建环境,而不是 Python 2.7,那么你要定义
python
变量,使其指向 Python 3。首先,定义 Python 3 实例的位置:
which python3
你的输出应该看起来类似这样:
usrlocal/bin/python3
现在,在你的
mkvirtualenv
命令中使用它来定义 Python 3+ 环境:
mkvirtualenv test —python=usrlocal/bin/python3
你应该会看到“(test)”添加到了控制台提示的开端。这意味着环境现在已经激活。
如果你的输出为
-bash: mkvirtualenv: command not found
,那么你的控制台没有识别出virtualenvwrapper
。首先,检查并确认在运行这段代码前打开了新的控制台或 cmd 窗口,这确保新的设置被应用。如果这不是问题,那么浏览整个过程并确认跟随了所有的步骤。
如果你成功地创建了虚拟环境,那么你完成了设置!
让我们禁用虚拟环境并摧毁它,因为这只是一个测试。运行下面的命令来移除 test 环境:
deactivate
rmvirtualenv test
这时,你已经在机器上设置了第二个 Python 实例。你还有了一个可以创建独立的 Python 实例的环境,可以在不同的项目间做保护。现在我们会运行一些练习,使你熟悉崭新的 Python 环境。
D.8 学习我们的新环境(Windows、Mac、Linux)
这里展示的例子是面向 Mac 的,但是过程与 Windows 和 Linux 上是相同的。在这一节中,我们会学习一些关于如何使用设置并确保所有的组件一起工作的知识。
让我们通过创建一个名为 testprojects 的新环境开始。我们会在任何需要一个快速的环境来练习测试或做其他事情时,激活并使用它。运行下面的命令来创建它:
$ mkvirtualenv testprojects
创建环境后,你会看到控制台提示的前面添加了环境名称。对我来说,像下面这样:
(testprojects)Jacquelines-MacBook-Pro:~ jacquelinekazil$
让我们安装一个 Python 库到环境中。我们会安装的第一个库称为 ipython
。在你的激活环境中,运行下面的命令:
(testprojects) $ pip install ipython
如果这个命令是成功的,那么你输出的最后几行看起来像下面这样:
Installing collected packages: ipython, gnureadline
Successfully installed ipython gnureadline
Cleaning up...
现在,如果你输入 pip freeze
到控制台,会看到当前环境的库,同时还有每个安装的版本号。输出会类似下面这样:
gnureadline==6.3.3
ipython==2.1.0
wsgiref==0.1.2
这些输出告诉我们,在 testprojects 环境中,我们安装了 3 个库:gnureadline
、ipython
和 wsgiref
。ipython
是我们刚刚安装的库。gnureadline
是在安装 ipython
时安装的库,因为这是一个依赖库。(这让你避免了需要直接安装依赖的库。很好,不是吗?)第三个库是 wsgiref
。它默认存在,但是不是必需的。
所以我们已经安装了一个叫 ipython
的库,但是我们可以用它做些什么呢?IPython 是一个易于使用的 Python 默认解释器的替代(你可以在附录 F 中读到更多关于 IPython 的信息)。为了启动 IPython,直接输入 ipython
。
你会看到类似下面的输入提示:
IPython 3.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
对其进行测试,输入下面命令:
In [1]: import sys
In [2]: import pprint
In [3]: pprint.pprint(sys.path)
你应该会看到与我们确认环境工作时相同的输出。sys
和 pprint
是标准库模块,打包在 Python 之中。
有两种方法退出 IPython。你可以按下 Ctrl+D,在提示时输入 y
(yes),或者只是输入 quit()
。它的工作方式同默认的 Python shell 一样。
一旦你退出了,你会回到命令行。现在我们有了一个叫 testprojects 的环境,有 3 个库已经安装。但是如果我们致力于其他项目,想要有另一个环境呢?首先,输入下面的命令禁用当前的环境:
$ deactivate
之后创建一个新的叫作 sandbox 的环境:
$ mkvirtualenv sandbox
完成之后,你会进入新环境。如果输入 pip freeze
,你会看到这个环境还没有安装 IPython。因为这是一个全新的环境,与 testprojects 环境完全分离。如果我们在这个环境中安装 IPython,它会在计算机上安装第二个实例。这保证我们在一个环境中所做的任何事不会影响其他的环境。
为什么它很重要?随着新项目的进行,你会想安装不同的库以及不同版本的库。我们建议为本书创建一个虚拟环境,但是如果你启动了一个新的项目,你会想要创建一个新的虚拟环境。正如你所见,随着项目的切换,在不同的环境中切换是很容易的。
有时候,你可能会碰到所有依赖都存储在一个名为 requirements.txt 文件中的仓库。库作者使用虚拟环境和 pip freeze
来保存列表,这样用户可以安装库和依赖。从 requirements 文件安装包,你需要运行 pip install -r requirements.txt
。
我们知道如何创建和禁用环境,但是我们不知道如何激活一个已经存在的环境。为了激活我们名为 sandbox 的样例环境,输入下面的命令(如果你已经在其中了,需要先 deactivate
它,来看有什么区别):
$ workon sandbox
最后,你如何摧毁一个环境呢?首先,确保你不在想要删除的环境中。如果你键入了 workon sandbox
,那么你应该在 sandbox 环境中了。为了删除它,首先你需要禁用它,然后移除它:
$ deactivate
$ rmvirtualenv sandbox
现在,你唯一应该拥有的环境为 testprojects。
D.9 高级设置回顾
你的计算机现在已经设置好,可以运行高级 Python 库。在与命令行交互和安装包时,你应该感到很舒服。如果你还不是很熟练,我们同样建议你查看附录 C 来学习更多使用命令行的知识。
表 D-1 列出了你在虚拟环境中最常用的命令。
表D-1:回顾命令
命令 | 动作 |
---|---|
mkvirtualenv
| 创建一个环境 |
rmvirtualenv
| 移除一个环境 |
workon
| 激活一个环境 |
deactivate
| 禁用当前活跃的环境 |
pip install
| 在活跃环境中安装包 a |
pip uninstall
| 在一个活跃的环境中卸载包 b |
pip freeze
| 返回一个活跃环境中已安装库的列表 |
a 如果没有环境是活跃的,库会被安装到你系统上 Python 的第二个副本上,它通过 Homebrew 安装。你的系统 Python 不会受到影响。
b 见前一条脚注。