注:这篇文章的主要受众是《Flask Web 开发实战》的读者。
注2:文中的 $ 符号标识一条命令行命令的开始,$ 前面是当前工作目录,# 号后面是注释。你实际只需要输入 $ 符号和 # 号之间的内容,不包括开头和结尾的空格。
在群聊和论坛里总是看到和虚拟环境和依赖安装相关的各类问题,这篇文章希望能够提供一个统一的解决方案。下次如果遇到有人问虚拟环境/Pipenv/依赖安装相关的问题,请把这篇文章的链接丢过去。
安装 Python 库非常慢?
在进入正题之前,你需要先解决基础设施问题。你在执行 pip install 命令或 pipenv install 等命令时会不会网速非常慢?20k/s 或者干脆看到 Time out,Connection reset 之类的报错,这种情况下,你需要设置 PyPI 镜像。具体操作可以在这篇《从国内的 PyPI 镜像(源)安装 Python 包》看到。
要不要继续使用 Pipenv?
因为书里面在一开始介绍了使用 Pipenv 管理依赖和虚拟环境,同时所有的安装第三方库的命令也都是使用 Pipenv,所以我们要解决的第一个问题是「要不要继续使用 Pipenv?」
我的建议是,如果你在使用的过程中没有遇到过任何报错,那么就继续使用它。直到你觉得它在某些地方不再让你满意。
- 锁定依赖很慢,停留在「locking…」这样的提示不动
- 执行正确的命令但是总是出现报错
附注 如果你安装依赖时的报错是「MarkupSafe setup.py: ImportError: cannot import name Feature」,请参考这篇文章解决。
那么就继续看下去。
如果不用 Pipenv,我该怎么办?
解决方法和替代工具非常多,这里给出两个。
方法一:不用虚拟环境
最简单的解决方法就是不用虚拟环境。如果你是一个初学者,那么不用虚拟环境完全没问题。现在你把所有的 Python 包全都安装在一个盒子里,你只需要会使用 pip 安装依赖,也就是使用下面的 pip install 命令:
$ pip install flask
附注 顺便说一句,不用虚拟环境时,如果你是使用 Linux 和 macOS 系统的 Python 3 用户,那么执行 Python 和 pip 相关命令的时候需要输入的是 python3 和 pip3,比如:pip3 install flask。后面不再提示。
这个命令会为你安装 Flask。每到需要安装一个包,你就执行这个命令,把上面的 flask 替换成你要安装的包名即可。类似的,书中所有 pipenv install xxx 形式的命令也都替换为 pip install xxx。
这时你可以跳过 Pipenv 和虚拟环境相关的内容。在第一章,当你把当前工作目录切换到 helloflask 文件夹内之后,整个 1.1 小节你只需要执行下面这行命令:
$ pip install -r requirements.txt
而第二部分每章开头的下面这两行命令:
$ pipenv install --dev $ pipenv shell
都要替换为:
$ pip install -r requirements.txt
这个命令会安装对应项目的所有依赖,所以后续介绍各个 Python 库时的安装命令不需要再执行。
方法二:使用 virtualenv/venv 来管理虚拟环境,搭配 pip 来管理依赖
第二种方法是改用更基础的工具:你仍然使用 pip 安装依赖,同时搭配 virtualenv 或 venv 来管理虚拟环境。如果你选择这个方法,那就跳过书中对 Pipenv 的介绍,改为阅读这篇《要不我们还是用回 virtualenv/venv 和 pip 吧》。阅读完上述文章后,再继续阅读。
现在你可以跳过 Pipenv 相关的内容。第一章切换进 helloflask 目录后,整个 1.1 小节你只需要执行下面的命令:
$ python -m venv env # Linux、macOS 系统的 Python3 用户,使用 python3 -m venv env $ env\Scripts\activate # Linux、macOS 系统使用 source env/bin/activate $ pip install -r requirements.txt # 这个命令会安装对应项目的所有依赖
附注 :上面命令里 # 号及之后的文字是注释,不需要输入。如果你使用 Python2,第一条命令需要改为 virtualenv env。这三行命令的作用依次为:创建虚拟环境、激活虚拟环境、从 requirements.txt 文件安装依赖列表。
类似的,第二部分每章开头的下面这两行命令:
$ pipenv install --dev $ pipenv shell
都要替换为:
$ python -m venv env # Linux、macOS 系统的 Python3 用户,使用 python3 -m venv env $ env\Scripts\activate # Linux、macOS 系统使用 source env/bin/activate $ pip install -r requirements.txt # 这个命令会安装对应项目的所有依赖
同时书中所有 pipenv install xxx 形式的命令都替换为 pip install xxx(不过你并不需要一个一个执行,因为每章开头执行 pip install -r requirements.txt 时会安装所有项目相关的依赖)。
对于 PyCharm 设置 Python 解释器部分的内容,大致可以沿用,只不过在图 1-4 的位置你需要从列表里选择当前目录 env 文件夹(虚拟环境文件夹)中的 Python 解释器,根据操作系统的不同,将会是 env/bin/python 或 env\Scripts\python.exe。
退出虚拟环境时,使用下面的命令:
$ deactivate
使用书中同样的代码,但是却出现报错?/ 我该怎么安装依赖?
有一些 Python 库在版本变化时会带来 API 的变化,而书中示例程序代码是基于每章开头注明的 Python 库来开发的,所以在更新依赖版本的时候可能会导致示例程序的代码出错。我建议你按照书中的命令来安装依赖,这会从项目依赖文件里安装固定版本的依赖列表,不要跳过第二部分每章开头的命令。
具体来说,如果使用 Pipenv,对应的安装依赖的命令是:
$ pipenv install --dev
如果使用 pip,对应的命令则是(如果创建了虚拟环境,需要先激活虚拟环境):
$ pip install -r requirements.txt
如果是第一章的示例程序,那么在 helloflask 目录下执行一次即可。如果是第二章的四个程序,那么在每一个程序的根目录执行一次即可。后续所有介绍新的 Python 包时给出的安装命令不用再执行。
关于第一部分示例程序的项目结构和启动问题
在第一部分的源码中,一共有 6 个 Flask 程序,分别保存在 helloflask/demos/ 目录下的六个子文件夹内。用来存储环境变量的 .env 和 .flaskenv 文件需要在这些子文件夹内创建,而不是放到顶层目录(helloflask/)。同时为了方便操作,这 6 个程序共用同一个虚拟环境,所以在 helloflask/ 目录下创建虚拟环境。
注意 不要在 helloflask/ 目录下创建 .env 和 .flaskenv 文件,这会导致子目录下的程序无法正确启动(issue #3561)。
如果你按照书里给出的提示执行命令,一般不会出现问题。但是为了防止各种意外情况,这里列一下本书第一部分的操作流程($ 符号前是当前工作目录)。
具体的操作顺序就是,克隆仓库以后,切换到 helloflask 目录:
$ cd helloflask
然后创建虚拟环境、激活虚拟环境、安装依赖:
/helloflask $ python -m venv env # Linux、macOS 系统的 Python3 用户,使用 python3 -m venv env /helloflask $ env\Scripts\activate # Linux、macOS 系统使用 source env/bin/activate /helloflask $ pip install -r requirements.txt # 这个命令会安装对应项目的所有依赖
接着看到介绍 Flask 最小程序部分,启动第一部分的示例程序:
helloflask/ $ cd demos/hello helloflask/demos/hello $ flask run
现在看到了第二章,启动第二部分的示例程序(先执行 cd .. 回到上层目录,即 demos/ 目录):
helloflask/demos/hello $ cd .. helloflask/demos $ cd http helloflask/demos/http $ flask run
看到第三章,启动第三部分的示例程序:
helloflask/demos/http $ cd .. helloflask/demos $ cd template helloflask/demos/template $ flask run
以此类推。
遇到了自己没法解决的问题怎么办?
如果遇到问题,你可以先尝试:
自己无法解决的话,可以: