3. pyenv+pipenv管理虚拟环境

一、使用 `pyenv` 管理 `python` 版本

mac下用brew:

$ brew install pyenv
$ pyenv install --list #查看python可安装列表
$ pyenv versions # 查看当前系统下面的所有版本,默认版本会有*标记
$ pyenv global 3.7.3 # 设置当前系统下3.7.3为全局版本

二、使用 `Pipenv` 管理 `Python` 虚拟环境

mac下安装:

$ brew install pipenv

linux debian, ubuntu下安装:

$ sudo apt install pipenv

安装 flask 并提定 python 3.6.7 版本为当前环境:

$ pipenv --python 3.6.7 #指定虚拟环境python版本为3.6.7
$ pipenv install flask #安装flask

虚拟机环境默认位于 ~/.local/share/virtualenvs/,由于 pipenv 通过路径名哈希值与虚拟环境 建立映射关系,因此如果移动项目会导致虚拟环境不可用。可以通过在 .bashrc 添加,在哪个文件下面添加看你们系统:

$ export PIPENV_VENV_IN_PROJECT=1

pipenv 在项目文件中创建虚拟环境,这时候虚拟环境位于 myproject/.venv 文件夹下。

创建一个应用 app.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

运行应用:

# -h 默认127.0.0.1 -p 5000端口
$ pipenv run flask run -h 0.0.0.0 -p 5001#启动flask

flask run 他会自动从当前目录查找 app.pywsgi.py 两个文件里面去调用 app 应用。

也就是上面 app.py 里面的 app = Flask(__name__) 这个变量。如果不是这两个名称。

比如 run.py 那需要设置环境变量 $export FLASK_APP=run, 这样才去执行 flask run 他就会从这个 run.py 里面的 app 去调用

技巧 这里设置这个环境变量非常的不方便,而Flask支持 python-dotenv 他会在 flask run 执行时自动去读取根目录的 .flaskenv.env,后者会覆盖前者的环境变量。

前者是公共的变量,后者是私有变量。所以这个 .env 在git提交到项目时是不在git里面的, 比如数据库连接信息等可以放在这里。

现在试下用安装好 python-dotenv,并在根目录创建 .flaskenv 后执行 run.py 这个应用:

$ pipenv install python-dotenv

根目录创建 run.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return 'App, Hello, World!'

根目录创建 .flaskenv:

FLASK_APP=run.py
FLASK_ENV = 'development' #开发模式,会热重载修改后的内容

再启动一个应用:

$ pipenv run flask run -h 0.0.0.0 -p 5002#启动flask -h指定网卡IP -p 指定端口

验证下两个应用的输出:

$ curl http://127.0.0.1:5002
App, Hello, World!
$ curl http://127.0.0.1:5001
Hello, World!

pipenv install 后根目标会多出两个文件 PipfilePipfile.lock

Pipfile 这个就是项目的依赖文件:

[[source]]
name = "pypi"
#这个地方就是拉取扩展的镜像源地址,可以替换国内镜像https://pypi.tuna.tsinghua.edu.cn/simple/
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
flask = "*"
python-dotenv = "*"

[requires]
python_version = "3.6"

提示

可以替换国内镜像https://pypi.tuna.tsinghua.edu.cn/simple/, 来加快拉取速度

以后只要到 pipenv install 他就会安装好现有的所有依赖, 是不是很方便. 到此,本地开发环境就算可以了。