写代码前的准备工作

使用 pipenv 搭建环境

准备一个全新的文件夹 (最好全英文字母且无空格),作为项目文件夹,获得其路径。
然后打开命令行窗口, 再 cd 刚才的路径,如果路径中有空格,务必使用引号包裹。如果不清楚刚才文件夹的路径,一般直接将文件夹拖入到命令行窗口,鼠标松掉就会自动填入当前文件夹的路径。
再运行 pipenv --python 2.7 就能创建一个全新的 Python 环境。这个过程一般 20 秒左右就会完成,也可能会有慢点,如果很长时间 (比如超过 5 分钟)仍未成功,可以在确保完全处于世界互联网联网状态或者完全的自然网络下,再尝试。另外,在命令行窗口中使用快捷键 Control+C 一般可以退出当前的命令运行。

然后,我们要安装下面的 module :

  • dnslib==0.9.10
  • dnspython==1.16.0
  • gevent==1.4.0
  • flask==1.1.1

你也可以直接忽略掉指定的版本,比如不是 pipenv install dnslib==0.9.10 ,而是直接的 pipenv install dnslib,没有特殊情况下也是可以的。正常调用某个 module 内的函数,如果报错并提醒出现问题了,那才说明 module 的版本不恰当了。而上面几个 module 是使用比较广泛的,其对应的某些(基本)函数的调用,基本上不大会有版本兼容问题。

安装 module,直接运行 pipenv install 对应的名称 就可以了;之前介绍 pipenv 的时候,也提到过,这个过程可能会比较慢,也可以直接在当前文件夹的路径下,运行 pipenv shell,进入对应的虚拟环境后,再依次执行 pip install 对应的module名 进行安装。
再次强调,pipenv 的命令行,必然是针对当前文件夹的操作,所以,务必要先 cd 对应的项目文件夹路径。 (注意:此时的命令是 pip,而不再是 pipenv)

用 PyCharm 中打开

我们把刚才的项目文件夹在 PyCharm 中打开,可以通过顶部菜单 File --> Open...,会有弹窗出来询问 Open Project 是否新窗口中打开,选择 Open in new window:

然后对当前 Project 进行配置,主要是选择正确的 Python 解释器,这方面的内容,请参考之前介绍 PyCharm 如何使用的内容。
因为使用了 pipenv 来创建环境,所以,选择 Python 解释器 的时候,可能需要新建一个由 pipenv 支持的解释器,也可能 PyCharm 打开 Project 的时候,自动创建好了,你只需要在 Python 解释器 的列表中选中就可以了。

换个方式打开 PyCharm

一台设备是可以开出 6 万多个端口的,而MacOS 上默认一些数值较小的端口 (比如小于 1024 ) 是不允许非管理员开启的。所谓的端口开启,是指程序去绑定端口。
DNS 要使用 53 端口 (Amazon 的云服务有一个 Route53 的 DNS 托管服务,当你明白 53 端口有什么用,也就明白了这个产品名的含义了),很明显,这个 53 端口需要管理员才能打开。而我们一般运行程序时,并不是以管理员身份运行的,所以,我们需要将 PyCharm 处于管理员运行的状态,不然将无法直接使用 53 端口。

首先,在操作系统的 Finder 里,然后应用程序 (Application) 中找到 PyCharm 或者 PyCharm CE(版),然后右键点击,在弹出菜单中选择 显示包内容,然后再依次进入 Contents --> MacOS。打开 命令行窗口, 输入 sudo,并空一格,再把刚才 MacOS 内的 pycharm 这个文件拖入到命令行窗口中,当前命令行就会变成 sudo /Applications/PyCharm\ CE.app/Contents/MacOS/pycharm,敲击回车,系统会询问密码,输入 MacOS 中的账户密码,就会直接运行 PyCharm 了。
sudo 表示使用 admin 账户权限,需要进行账户密码校验,同时,此时的 PyCharm 获得打开 1024 以下的端口号权限了。但需要注意,现在是 admin 用户了,此时对于 PyCharm 来说相当于重装了,所以会弹出一些初始化的窗口,自行确认即可。原来 Project 的配置可能需要重新配置,主要是 Python 的解释器需要重新设定,按照前面章节对 PyCharm 使用方法的介绍,可能需要重新在 PyCharm 内重建一个 pipenv 对应的 Python 解释器

包括 modules 也可能需要重新安装,然后很快你会遇到类似下面的问题:

hepochens-MacBook-Pro:cmdtest hepochen$ pipenv shell
Launching subshell in virtual environment…
bash-3.2$  . /Users/hepochen/.local/share/virtualenvs/cmdtest-XejNz_50/bin/activate
(cmdtest) bash-3.2$ pip install dnslib==0.9.10
Collecting dnslib==0.9.10
.......
Successfully built dnslib
Installing collected packages: dnslib
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Users/hepochen/.local/share/virtualenvs/cmdtest-XejNz_50/lib/python2.7/site-packages/dnslib-0.9.10.dist-info'
Consider using the `--user` option or check the permissions.

不要紧张,很多时候,错误信息就是解决方案,此时没有大的必要去用 Google 搜索。比如上文,明确说就是 Permission denied,解决方法的提示是 Consider using the '--user' option or check the permissions,我们创建的是 虚拟环境, 使用 --user 不合适,那么就剩 permissions 了。
而且根据提示,我们可以推断得到 /Users/hepochen/.local/share/virtualenvs/cmdtest-XejNz_50 就是虚拟环境的根目录,因为使用了 sudo,这个目录的所有者应该会是 admin,普通用户自然没有权限写入内容到这个目录中。很简单,我们在命令行里运行 sudo chmod -R 777 /Users/hepochen/.local/share/virtualenvs/cmdtest-XejNz_50,把这个虚拟环境根目录的读写权限全部开放,然后再 pip install xxx 就可以了。

严重注意: 使用 sudo 打开 PyCharm,仅限于 DNS 服务器的开发,其它时候不要这样用,会产生一些潜在的权限问题!!

如果上一步失败了

已经处于 admin 权限下,在 PyCharm 内设定一个 Python 解释器,可能会触发 PyCharm 调用 pipenv 去新建一个全新的虚拟环境 (即使它已经存在了)。
之前在 非admin 的情况下,命令行窗口直接 pipenv --python 2.7 不过 20 秒左右就完成了,而在 admin 的权限下,这个时间反倒可能变得很长,也不知道是否正常运行,甚至还有可能弹出错误的窗口。

一般的常理,不少人此时会抱怨 pipenv 多烂,甚至这个课程有多不负责任,『在准备的过程中,还这么多问题』……
我们要跳出这个常理,回顾下为什么使用 pipenv?为什么需要一个 Python 的虚拟环境?只要 pipenv 这个工具能解决根本的需求,就是很棒的工具,至于中间有些糟糕的环节也不是大碍,解决它们就好。不求完美的工具,我们自己有能力去改变或者创造,不然,也不会开始学习写代码了。

如果之前都失败了,我们可能需要先清除下之前因为失败而残留的数据,一个是虚拟环境的根目录 (文件夹),比如类似 /Users/hepochen/.local/share/virtualenvs/cmdtest-XejNz_50,另外一个是项目文件夹内的 Pipfile 文件,这些都需要被删除掉。你可以在 Finder 中进行删除,Finder 里一个快捷键是 Command+G,可以直接输入路径。你也可以使用命令行操作,比如 sudo rm -rf xxxxx,但是,sudo + rm 对于初学者来说,是很危险的操作!!!!!! 别一不小心,把自己的整个磁盘全部删除了。

现在,再回顾一下,Python 的环境到底是什么?
利用 PyCharm 重复创建一个 pipenv 环境,不过是让 PyCharm 能识别到对应的 Python 解释器 路径而已。那我们能不能直接告诉 PyCharm 新的虚拟环境的解释器路径呢?
获得 pipenv 某个虚拟环境的 Python 解释器路径,可以在命令行窗口中运行 pipenv --py
PyCharm 内的操作参考下面两张截图:

另外,还有先创建再修改的方法,总之,基本原理明白了,方法总比困难多
手工添加 Python 解释器的窗口中,并没有输入路径的地方,可以先添加一个系统默认提供的,然后再在 Project Interpreters 的窗口内,手工修改就可以了。 有一点比较奇怪,系统默认的 /usr/bin/python 添加了也是无法修改路径的,可能也是系统权限的问题,需要添加我们后来安装的 Python 3 (可以 brew install python3 进行安装) 的解释器后再行修改。

Do Not Panic

你可能会在本节的 『准备』 内容中,手忙脚乱。
甚至遇到了问题,一时半会就是解决不了。
而且,你也清楚,目前还只是准备工作;这都如此麻烦了,后面可还怎么上手呀?
当然,也可能一帆风顺,准备基础环境的过程,非常顺当。
不管怎样,都是好的事情,不用慌张。

我们的重点,一直都在于 如何解决这个问题,而并非这个问题本身。
如果到头来实在搞不定,也不要怀疑自己对计算机的亲和力,大不了不使用虚拟环境,也是一种办法。或者不用 admin 进行 sudo 打开 PyCharm 也是一个办法,就是 Debug 比较麻烦。

了解基本的原理后,遇挫也只是一时的。
有时候,绕开问题本身,也是一种解决方案……