python
环境的管理一直是让人颇为头疼的,各种方案层出不穷,这里博主介绍一个最近发现的非常好用的管理方案——pyenv+pipenv
Homebrew
关于homebrew
的介绍和优化,参见博文
pyenv
pyenv
是一个python
版本管理器,可以在同一台电脑上安装多个版本的python
pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.
安装
打开终端或者iTerm
执行以下命令
brew update && brew install pyenv
以后升级pyenv
时,可以使用
brew upgrade pyenv
等homebrew
将pyenv
安装好后,我们需要改动一下环境变量
如果你用的是oh-my-zsh
那么你应该使用以下命令
# 首先输入命令
vim ~/.zshrc
# 然后在该文件最下面添加下面这一行
eval "$(pyenv init -)"
# 按 esc, :wq 保存退出后,输入命令
source ~/.zshrc
如果你使用的是其他终端,可以自行修改对应的配置文件,这里不一一列举了。
用pyenv
安装python
使用pyenv
安装python
十分简单,仅仅只有两条命令
pyenv install <版本号>
pyenv rehash
其中版本号可以用命令
pyenv install -l
查看可用的版本
例如安装python 3.8.2
就可以输入
pyenv install 3.8.2 && pyenv rehash
等带安装完毕后,可以使用命令
pyenv versions
查看当前系统安装的所有版本,并且查看当前所使用的版本
$ pyenv versions
system
3.5.6
3.5.7
3.5.8
3.5.9
3.6.10
* 3.6.5 (set by /Users/rainshaw/.pyenv/version)
3.6.6
3.6.7
3.6.8
3.6.9
3.7.4
3.7.5
3.7.6
3.7.7
3.8.1
3.8.2
可以看到,博主电脑上装上了常见的所有版本。
切换python
版本
在pyenv
中,有三种设置
pyenv global <版本号> # 用于设置整个系统里的python版本,也就是说如果没有特别设置下面两条命令,且没有进入虚拟环境中,那么使用的python版本就是global设置的版本
pyenv local <版本号> # 用于设置当前路径文件夹内的python版本,该设置会覆盖global设置
pyenv shell <版本号> # 用于设置当前终端的python版本,会覆盖以上两条设置
例如,你想在整个系统中使用3.6.5,而在某个文件夹下使用3.7.7
pyenv global 3.6.5
# cd path
pyenv local 3.7.7
这样我们就使得不同的python
版本在我们的电脑上共存。
pipenv
pipenv
是python
官方推荐的包管理工具。
安装
打开终端或者iTerm
执行以下命令
brew update && brew install pipenv
以后升级pipenv
时,可以使用
brew upgrade pipenv
等homebrew
将pipenv
安装好后,我们需要改动一下环境变量
如果你用的是oh-my-zsh
那么你应该使用以下命令
# 首先输入命令
vim ~/.zshrc
# 然后在该文件最下面添加下面这一行
export PIPENV_VENV_IN_PROJECT=1
# 按 esc, :wq 保存退出后,输入命令
source ~/.zshrc
如果你使用的是其他终端,可以自行修改对应的配置文件,这里不一一列举了。
新建虚拟环境
进入到项目目录中,输入以下命令
cd /path/to/project
pipenv --python <版本号>
第二条命令表示,给当前目录创建了一个虚拟环境,版本是版本号所指定的,并且此时会在当前目录下生成一个Pipfile
文件。
pipenv
会根据版本号去寻找pyenv
所安装的python
版本,如果不存在则调用pyenv
安装指定的python
版本。
由于我们已经更改了设置,所以虚拟环境被创建在当前目录下的.venv
子目录中。我们可以通过pipenv --venv
确认项目的虚拟环境目录,通过pipenv --rm
删除虚拟环境。
使用pipenv
管理依赖包
pipenv
使用Pipfile
和Pipfile.lock
来管理依赖包,并且在使用pipenv
安装或卸载包时,会自动维护修改Pipfile
文件,同时生成Pipfile.lock
来锁定安装包的版本和依赖信息。
实战
创建一个基于Django 2.2
的python3.8.2
的项目
首先安装python 3.8.2
pyenv install 3.8.2
其次创建项目目录然后创建虚拟环境
mkdir django_demo
cd django_demo
pipenv --python 3.8.2
然后安装项目依赖包
pipenv install django==2.2.10
pipenv install itsdangerous
pipenv install requests
此时查看Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
django = "==2.2.10"
itsdangerous = "*"
requests = "*"
[requires]
python_version = "3.8"
查看Pipfile.lock
{
"_meta": {
"hash": {
"sha256": "ed256e2c43a3e0fb55d677a163536287974823f4ed289f4f3fbf75b1859b2338"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.8"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304",
"sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"
],
"version": "==2020.4.5.1"
},
"chardet": {
"hashes": [
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
],
"version": "==3.0.4"
},
"django": {
"hashes": [
"sha256:1226168be1b1c7efd0e66ee79b0e0b58b2caa7ed87717909cd8a57bb13a7079a",
"sha256:9a4635813e2d498a3c01b10c701fe4a515d76dd290aaa792ccb65ca4ccb6b038"
],
"index": "pypi",
"version": "==2.2.10"
},
"idna": {
"hashes": [
"sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
"sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
],
"version": "==2.9"
},
"itsdangerous": {
"hashes": [
"sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
"sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
],
"index": "pypi",
"version": "==1.1.0"
},
"pytz": {
"hashes": [
"sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
"sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
],
"version": "==2019.3"
},
"requests": {
"hashes": [
"sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
"sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
],
"index": "pypi",
"version": "==2.23.0"
},
"sqlparse": {
"hashes": [
"sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e",
"sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"
],
"version": "==0.3.1"
},
"urllib3": {
"hashes": [
"sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
"sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
],
"version": "==1.25.8"
}
},
"develop": {}
}
我们可以看到,在Pipfile
中只列举了我们手动指定的包,而在Pipfile.lock
中还包含了它们的依赖包的信息。且在Pipfile
中我们可以看到,如果安装时没有指定包的版本,则会成为*
号,此时如果你在另一个地方利用Pipfile
安装虚拟环境,那么就会安装当时的最新的版本的包。如果安装时指定了包的版本,则以后创建虚拟环境时就会安装特定版本的包。
另外,我们可以使用pipenv graph
查看包之间的依赖关系
$ pipenv graph
Django==2.2.10
- pytz [required: Any, installed: 2019.3]
- sqlparse [required: Any, installed: 0.3.1]
itsdangerous==1.1.0
requests==2.23.0
- certifi [required: >=2017.4.17, installed: 2020.4.5.1]
- chardet [required: >=3.0.2,<4, installed: 3.0.4]
- idna [required: >=2.5,<3, installed: 2.9]
- urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.8]
卸载包也很简单
pipenv uninstall itsdangerous
在另一电脑上利用git复制项目后,可以用命令
pipenv install
就可以安装该项目中的所有包了,并且会自动为项目创建虚拟环境。
如果有项目之前是使用requirements.txt的,可以用命令
pipenv install -r requirements.txt
安装所有的依赖包。