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

homebrewpyenv安装好后,我们需要改动一下环境变量

如果你用的是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

pipenvpython官方推荐的包管理工具。

安装

打开终端或者iTerm执行以下命令

brew update && brew install pipenv

以后升级pipenv时,可以使用

brew upgrade pipenv

homebrewpipenv安装好后,我们需要改动一下环境变量

如果你用的是oh-my-zsh那么你应该使用以下命令

# 首先输入命令
vim ~/.zshrc
# 然后在该文件最下面添加下面这一行
export PIPENV_VENV_IN_PROJECT=1
# 按 esc, :wq 保存退出后,输入命令
source ~/.zshrc

如果你使用的是其他终端,可以自行修改对应的配置文件,这里不一一列举了。

其实你也可以不加上面这一行,这一行的设置表示,创建的虚拟环境就在你当前的目录中,也就是说,你到某个文件夹中,创建虚拟环境后,虚拟环境就在当前目录的下的.venv文件夹中

新建虚拟环境

进入到项目目录中,输入以下命令

cd /path/to/project
pipenv --python <版本号>

第二条命令表示,给当前目录创建了一个虚拟环境,版本是版本号所指定的,并且此时会在当前目录下生成一个Pipfile文件。

pipenv会根据版本号去寻找pyenv所安装的python版本,如果不存在则调用pyenv安装指定的python版本。

由于我们已经更改了设置,所以虚拟环境被创建在当前目录下的.venv子目录中。我们可以通过pipenv --venv确认项目的虚拟环境目录,通过pipenv --rm删除虚拟环境。

使用pipenv管理依赖包

pipenv使用PipfilePipfile.lock来管理依赖包,并且在使用pipenv安装或卸载包时,会自动维护修改Pipfile文件,同时生成Pipfile.lock来锁定安装包的版本和依赖信息。

实战

创建一个基于Django 2.2python3.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

安装所有的依赖包。

最后修改:2020 年 10 月 11 日
如果觉得我的文章对你有用,请随意赞赏