19
5 月
从0开始学Python:02搭建开发环境
- By IanGoo
从本文开始,我们将真正踏上码代码之路。
写程序这活,本身就要用到程序。为了让代码能跑起来,我们需要一系列软件构成一个“开发环境”(Development Environment),有的开发环境是高度集成化的One Piece,安装一套软件就可以完成从码代码到调试到编译运行到抓Bug乃至于写文档甚至学习技巧的全部工作,这种开发环境被称为“集成开发环境”(Integrated Development Environment,IDE),最有代表性的集成开发环境当然就是微软的航空母舰——Visual Studio。
Visual Studio给我带来的回忆是挺痛苦的,安装一下这玩意儿消耗的时间基本上都是一个小时起,如果安装离线文档的话一下午就没了。所以,虽然现在Visual Studio可以实现Python的All-in-One开发,我还是建议审慎使用,毕竟Visual Studio我叫它航空母舰不光是描述它的功能(确实很强),也是在描述它的体积(确实很大)。
另一类看起来就比较泥腿子了,随便抽出个文本编辑器就可以写代码,写完了用调试器调试,用编译器编译或者用解释器运行。至于用什么编辑器、用什么调试器、用什么编译器、用什么解释器,悉听尊便。如果说集成开发环境是品牌整机的话,这种散装开发环境就是自己攒的DIY机器。看起来没有一个世人皆知的BlingBling的品牌Logo,但是每一个零件都可以按照使用者的要求进行配置,可以做到极高的效率和极为舒适的使用体验。
所以,本文也将遵从泥腿子方法,在Windows环境下从零自建一整套开发环境。我们需要使用的东西有:
- Python Embeddable
- pip
- Microsoft PowerShell
- Microsoft Windows Terminal(可选)
- Microsoft Visual Studio Code
Contents
在开始之前:是时候更新一下Shell了
在Python学习的第二篇里,我们就提到了Unix Shell。在Unix和类Unix操作系统(BSD、Linux)当中,Shell的功能极为强大,但是到了Windows这边,只有一个祖传的“命令提示行”,这玩意儿的功能属实拉胯。
但是这也没有办法,因为两者压根就不是一个东西。
在Unix和类Unix操作系统当中,Shell极为重要。操作系统——本质上是一大堆程序的集合,这些程序有负责文件读写的、有负责内存管理的、有负责资源调度的,但是,这玩意儿得要和人交互,于是,在进行操作系统设计的时候,在这摊程序的外边设计了一个“壳”,在这个壳上做出相应的输入,数据传递给里面的内核,内核完成操作后将输出透过壳传递出来,这个“壳”,就是Shell。在Unix和类Unix操作系统的设计当中,Shell是一个完备的操作系统外壳,所有与操作系统的交互都是通过Shell来完成的——即便是通过图形界面也不例外。CLI(命令行界面)与GUI(图形界面)不过是Shell的两张脸。微软的Windows设计思路则不太一样,它的GUI从某种程度上说是Shell的本体,命令提示行这个东西更像是从DOS时代遗留下来的一个历史文物,很多通过GUI完成的操作在命令提示行里根本就没有对应的实现。
对于桌面来说,这不是一个问题。但是在某些场合,这就让Windows很尴尬了——比如服务器,比如超算(超级计算机)。这些设备都部署在远程。我们在桌面上使用图形环境的时候,数据走的是总线这样的康庄大道,从CPU到PCI-E再到HDMI或者DP,数据吞吐量之巨大完全够支撑GUI的运行。但是到了远程操作的时候,面对网线这样的小水管,想要传输图像就很尴尬了,用过远程桌面或者Teamviewer这样的远程控制软件的应该知道这种感觉。这种小水管传输纯文本的命令就便当多了,而类Unix系统的Shell功能强大这一点优势就非常明显了,因此,服务器操作系统往往使用的是不带GUI的类Unix操作系统,超算领域更是Linux一统天下。
为了应对这样尴尬的局面,微软推出了PowerShell作为Windows自己的“Shell”。和尴尬的命令提示行相比,PowerShell的功能终于强悍多了。
为什么要花这么多文字来提Shell,原因就在于多数Python实现的交互是通过CLI来完成的。在Linux当中非常简单,大把的终端工具可以用,但是在Windows下就比较蛋疼。一般只有文物级别的命令提示行可以用,就算是有了比较强的PowerShell,在写这篇稿子的时候,最新的Windows 10 20H2里内建的PowerShell依然是老旧的5.1,最新的PowerShell版本则是7.1。本文提到的编辑器Visual Studio Code会调用系统最新的PowerShell来作为与Python交互的界面,自然我们希望使用最新的PowerShell。
更新PowerShell的方法非常简单——微软已经将PowerShell上架到了Microsoft Store,直接在里面搜索、安装即可。

安装了PowerShell,还可以顺手安装一下Windows Terminal。
Emm……这又是个啥?
如前所述,Shell包裹着操作系统的内核,安装着这个操作系统的机器可能是一台服务器,有很多的终端机连接到这个服务器的操作系统的Shell,用户通过终端机输入命令,命令传递给Shell,Shell再将命令传递给内核(Kernel)。在逻辑上终端机是访问Shell的入口,它既可以安装在远程,也可以安装在本机。MacOS和Linux上的“终端”在操作本机的时候都属于本地的终端。长期以来,Windows也没有属于自己的终端应用,还好,微软也是痛定思痛,推出了自己的终端应用——Windows Terminal,同样在Microsoft Store里面可以下载。Windows Terminal可以打开命令提示行、PowerShell和Azure Cloud Shell,也可以连接到Linux,可以说是非常全能了,好好调校一下视觉效果也颇为不错。
搞定了Windows的Shell,下面我们开始整Python本体。
安装Python Embeddable
Python提供了两种主要的安装方式:Installer和Embeddable。对于大多数人来说,Installer是最简单的,像安装别的软件一样安装即可,系统会自动配置,还带了后面会介绍的pip,还有一个简易的IDE——IDLE。
虽然本系列是从0开始,但是并不意味着我们会忽略细节。Installer帮助用户配置了很多东西,这就意味着这些东西会被使用Installer部署的用户忽略掉——这些对于理解Python哲学是有不小的意义的,所以,我们会选择以Embeddable着手,自行搭建开发环境。
首先,下载Python Embeddable。到Python Windows下载页面选择Windows embeddable package (64-bit)
。下载下来之后,会发现这是一个.zip
包。
“Embeddable”指的是“可嵌入”,在别的软件当中需要使用Python的解释环境的时候,就可以使用Python Embeddable。在Alias和UE当中的Python其实都是Python Embeddable。这是最原始、最简单、最纯粹的官方Python环境,它只有一个cpython解释器和对应的交互环境,就这些。这两个也是运行Python的最低要求,而Installer里面其他的pip、IDLE之类的,统统没有——全都得自己动手丰衣足食。当然,除了cpython之外,还有别的解释器,如Pypy、jython等,不过最常用的还是官方的实现cpython。
这里我们可以将这个.zip
解压到一个地方,比如D:\tools\python
。检查一下python.exe
在这个文件夹里就可以。这就是我们的Python的根目录,这个目录非常重要,请记好。然后,我们用任意文本编辑器打开python目录当中的python39._pth
文件,将import site
前面的#
去掉。这会在日后我们引用别的包的时候自动将其添加到当前的运行环境。
然后,我们需要将这个目录添加到环境变量的PATH
当中。
在Windows Terminal、PowerShell或者命令提示行当中,我们可以通过输入诸如dir
、cd
这样的命令来实现特定的功能,这些命令其实都是一段小程序,对于系统内置的命令来说,直接敲,总能看懂。但是,Python是空降到我们的电脑当中的,系统应该不认识。这就是环境变量的作用,一旦一个目录被添加到环境变量的PATH
当中,我们就可以直接在命令提示行或者PowerShell当中执行该目录中的可执行文件。
添加环境变量的方法很简单:进入系统属性的高级
标签页,点环境变量(N)...
,就会看到环境变量窗口,我们在下方的系统变量(S)
中找到变量Path
,按下方的编辑(I)...
,在编辑环境变量
窗口中单击新建
,将Python的根目录D:\tools\python
粘贴到里面,确定
一下,就成功了。

此时,Python就算是安装完成了。我们打开PowerShell、命令提示行或者Windows Terminal,输入python
然后回车,如果出现这样的界面,那就说明Python已经能够使用了:

这个界面就是cpython的界面,在>>>
后面就可以输入Python代码,并立即得到结果,如这样:

Emm,顺手就写了编程新手最常写的第一个程序——Hello World。
安装pip
pip是什么?
我们在编写Python程序的时候,经常会用到一个语句:import
。import
的作用是引用某个外部的包。那么——这些包在哪儿呢?
答案是得从网上下载。Python支持使用包进行扩展,这一特性类似于Firefox浏览器,没有某些功能,可以通过扩展来实现,而pip就是管理这些包的工具。
如果使用Installer来部署Python的话,pip已经包含在内了。但是由于我们使用的是纯手动部署,就只能自己动手丰衣足食了。
pip本身就是一种扩展,要安装它,就需要一个初始的下载脚本,这个脚本可以从这里下载:https://bootstrap.pypa.io/get-pip.py。下载之后,将它扔到某个目录当中。
然后,我们使用命令行工具定位到这个目录。这个操作对于现代人来说比较古老,我们可以打开命令提示行、PowerShell或者Windows Terminal,然后用cd
命令来定位目录。如get-pip.py
放在E:\Downloads
当中,就可以输入:
cd E:\Downloads
当然,也有比较简单的方法,就是在目录窗口里右击,如果安装了Windows Terminal的话,可以看到Open in Windows Terminal
的选项,点这个选项会直接进入Windows Terminal并定位到该目录,也可以按住Shift然后右键,除了使用Windows Terminal打开的选项之外,还可以看到在此处打开PowerShell窗口
。这个选项就可以使用PowerShell进入这个目录——如果你的环境实在太过于古老(比如还在使用Windows 7甚至Windows XP的话),至少能看到在此处打开命令提示行
,这也是可以的。
进入目录后,运行命令:
python get-pip.py
这个命令的意思是“使用Python运行当前目录下的get-pip.py
这个脚本。Python目录已经被加入环境变量的Path,因此系统认识这个命令。而这也是日后我们运行Python脚本的常见操作,即python 脚本名称.py
。这个命令敲进去之后,Python马上就开始干活了,就可以在命令行的黑框框里看到这样的画面:

如果看到这样的画面,说明pip已经安装完成了。这时候打开Python根目录,就可以看到里面多了两个目录——Scripts
和Lib
。前者是Python调用的脚本目录,后者则是包的存储目录。
pip安装完成之后,需要做两件事情:
第一,如同pip安装完成后命令行提示的两段黄字所说,将Scripts
目录加入到Path环境变量。这主要是方便日后可以直接通过pip命令来添加、删除、更新、管理Python包。操作和之前将Python根目录添加到Path环境变量的方法一样,如果你的Python安装在D:\tools\python
当中的话,就在Path里面添加D:\tools\python\Scripts
。在介绍如何添加环境变量的那张图里已经添加进去了。
第二,将包的目录添加到当前的Python环境。还是使用任意文本编辑器打开python39._pth
,在最下面添加一行:Lib\site-packages
。这就使得我们以后在编写程序的时候使用import
导入包的时候可以扫描这个目录。
我们可以尝试运行一下pip看看有没有安装成功,重启命令行后运行pip list
可以查看目前已经安装的包:

如果出现上图就说明pip也安装成功了。
安装、配置编辑器
编写源代码,其实本质上是在处理纯文本文件,这就要用到文本编辑器。在Windows系统上,普及率最高的文本编辑器当属系统自带的记事本。但是,记事本的功能也是相当孱弱的,用它来写代码相当难受。因此,程序猿们普遍使用的是一些比较高级的文本编辑器,如VIM、Emacs、UltraEdit、EmEditor、Atom、Brackets、Sublime……(要是不踩刹车的话还能继续写出一长串)。
我使用的是微软推出的文本编辑器——Visual Studio Code。注意!不是Visual Studio!Visual Studio Code属于编辑器,而Visual Studio属于IDE(集成开发环境),后者的功能比前者多太多,当然体积也大太多。我们既然选择了自己动手丰衣足食,自然是拿Visual Studio Code(以下简称VSCode)开刀。
首先,当然是到官方网站下载VSCode。VSCode也是跨平台的软件,支持Windows、MacOS和Linux三个操作系统,以及X86、X86-64和ARM三种CPU,注意不要下载错了。对于看本文的读者来说,下载Windows、64bit、Stable Build、User Installer就OK了。什么?Linux用户?那还浪费什么时间读这一段该干嘛干嘛去……
VSCode安装完成后,大概会注意到这软件是全英文的。If you confident on your English proficiency, including professional words and expressions in programming, just go ahead. 如果心里慌得一批,也可以将VSCode改为中文界面。VSCode支持扩展,中文界面也是通过扩展来实现的。点击左侧栏的第五个图标进入扩展选项卡,在里面搜索“Chinese”,跳出来的搜索结果里在最顶上就能找到Chinese (Simplified) Language Pack for Visual Studio Code,安装后重启一下VSCode,整个VSCode就都变成了中文界面。
同样的,我们也可以在这里直接安装Python扩展,这样就可以将VSCode打造成一个非常好用的Python开发环境。搜索“Python”,第一个就是微软官方出的Python扩展:

ms-python.python
除了这个扩展,Python还会另外安装两个扩展:Pylance和Jupyter。Pylance可以提供代码自动补完、自动显示函数文档等等功能,极大提升Python的代码书写体验。
Python安装完成后,应该会自动指定Python解释器的位置,如果没有的话自己选择一下就OK,应该会自动弹出Python的安装目录。如果一切正常的话,会在窗口的左下角显示当前Python解释器的版本,这样一个面向Python开发的VSCode环境就建构完成了,我们可以新建一个文件,选择Python文件类型(两种方法,第一种是在新建文件的界面上单击选择语言{0}
,然后选择Python,或者按快捷键Ctrl
+K
、M
后选择Python),将这个文件保存一下,然后在里面再写一次Hello World:
print("Hello World")
然后在窗口右上角会找到一个绿色三角形,这就是运行的按钮,运行一下,VSCode会调用命令行,在下方的终端当中输出运行结果:

这就是我们使用VSCode进行Python进行程序设计的基本操作,以后在本教程当中我就不会做如此详细的配图叙述了,而只是阐述代码和运行结果,这样会更加简洁明了。
至于Jupyter,这个不一定会用到,感兴趣的可以阅读一下:
其他平台与环境的搭建方法
IDLE
如果使用安装的方式部署Python,那么在它的里面已经带上了一个IDE,名字叫IDLE。这里可以直接进行Python的代码编写和调试运行的工作。
关于IDLE的使用手册可以参考这里:https://cloud.tencent.com/developer/section/1372304。
Visual Studio
前面一直介绍的是Visual Studio Code,Visual Studio Code还有一个大哥——宇宙第一IDE,Visual Studio。Visual Studio在2017之后开始增加了对Python的支持。
虽说Visual Studio以往是收费软件,而且价格非常高昂,不过现在有了社区版的Visual Studio,可以免费使用。
关于在Visual Studio当中开发Python可以参考这里:https://docs.microsoft.com/zh-cn/visualstudio/python/installing-python-support-in-visual-studio?view=vs-2019。
PyCharm
PyCharm是JetBrains推出的Python IDE,和Visual Studio一样,PyCharm的社区版本也是免费的。
关于PyCharm的使用和配置,还是参考官方使用手册:https://www.jetbrains.com/zh-cn/pycharm/learn/。
Linux系统下的Python
就我所知,很多Linux发行版出厂就带有Python环境,再加上Linux系统比Windows强大到不知哪里去的Shell,再加上各种舒适无比的编辑器基本上都有Linux版本(包括微软的VSCode),其实在Linux下写Python是一件非常舒适的事情。就算是发现没有Python,多数发行版的软件仓库也都有Python和pip,用对应发行版的包管理程序安装就好了,Windows下长篇大论的事情用一行sudo pacman -S python python-pip
就搞定的事情(顺便也暴露了我用的是Arch系发行版的事实),配置环境变量什么乱七八糟的统统不用。
而且……作为Linux用户,理应具备了相当的计算机操作基础和对计算机软硬件原理的理解,应该根本就不用费太多力气吧……配置得当的话,Linux下编写Python和Windows下可以做到体验完全一致的。
开发环境的维护
和很多软件一样,Python环境也需要维护。不过既然我们选择了泥腿子风格自建开发环境,维护的事情自然也比较碎一些,大致可以分成下面几个板块:
升级VSCode
这个么的啥好说的,如果是User Installation或者System Installation安装方式的VSCode的话,如果有新版本会在侧栏弹通知,重启一下就可以自动更新。如果是比较爱好折腾用的是VSCode Portable,也会弹通知,下载一个.zip
文件后覆盖一下也就完事了(话说,折腾zip包部署VSCode的肯定知道怎么折腾)。至于扩展,完全是自动升级,而且彻底无感化,只有需要刷新VSCode的时候会弹出一个通知,按照通知做就可以了。
升级Python
如果是通过Installer安装的Python,那么下载新版本的Python直接安装就可以了。
如果使用的是Python Embeddable,那么就会麻烦一些。
首先,备份好旧版本的Python目录,备份在任何时候都是一个好习惯。
然后,打开下载下来的Python Embeddable包,将里面除了python39._pth
外的全部文件复制到Python根目录,覆盖旧文件即可。
如果是大版本升级,需要将._pth
文件的内容复制到新文件当中。例如从Python 3.8升级到3.9,需要的就是将python38._pth
的文件内容复制到python39._pth
当中。
升级pip
通过以下命令可以检查pip模块的更新情况:
pip list -o
这个命令会列出所有过时的模块。一般的模块升级可以用下一节的方法,但是如果列表中出现了pip本身,那么不能用下面升级模块的方法来升级pip本身。
其实升级pip的方法一般会有高亮文字提示,是执行下面的命令:
python -m pip install --upgrade pip
升级模块
还是通过以下命令列出过时模块:
pip list -o
然后通过以下命令升级模块:
pip install -U MODULE_NAME
非常简单。
当然,我们经常在检查过时模块的时候,查出来一堆。这时候一个个手动升级当然非常麻烦。
但是我们在讨论什么?我们在讨论Python,这是一种程序语言,最擅长将繁琐复杂的重复性操作一次完成。用下面的代码就可以搞定了:
import pip
from subprocess import call
from pip._internal.utils.misc import get_installed_distributions
if __name__=='__main__':
for dist in get_installed_distributions():
call('pip install --upgrade '+dist.project_name,shell=True)
用Python运行上面的代码即可,非常容易。
更新:但是在某次升级之后,这段代码似乎失效了。但是没关系,我们在讨论什么?我们在讨论Python。说Python是一个操作系统也不为过,它里面有大量的Package可以帮助我们完成Package管理的工作——一个成熟的包管理系统应该学会自己管理自己。这个Package叫pip-review。只需要执行:
pip install pip-review
即可。之后,就可以使用pip-review -i
来执行Package的检查更新。
清空Package并重装
在某些极端的情况下,Package环境可能完全乱掉,以至于我们需要将所有Package全部干掉重装。比如在升级了CPython之后,就有可能导致这个问题。
一个一个卸载显然是非常蛋疼的,但是我们在讨论什么?我们在讨论Python。Python有一个独特的方式来实现Package的批量安装和卸载:
pip install/uninstall -r [filename]
这个命令是读取一个文件名为[filename]
的文件,这个文件的内容是按照pip requirements的特定格式规范写成的,包含Package的名称和版本,这个命令会按照文件的内容批量安装或者卸载特定的Package。
那么思路就很简单:我们可以将当前pip当中的所有Package输出到一个文件,然后按照这个文件,按图索骥,批量卸载。那么执行的命令就很简单了:
pip freeze > [filename]
pip uninstall -r [filename] -y
第一行作用就是将当前的Package列表按照requirements输出成一个文件,这个命令pip freeze
就是干这个的。但是,由于requirements一般用于包的管理,考虑到这个实际用途,内置的三个包:pip
、wheel
和setuptools
是不会显示的。我们一般也不会特地去卸载这三个Package。
第二行就是按照输出的文件批量卸载,最后一个-y
参数,指的是每一行都默认按个Y
键,这样就不用我们自己一行一行来按了。