Loading... <div class="tip share">请注意,本文编写于 812 天前,最后修改于 632 天前,其中某些信息可能已经过时。</div> `python`环境的管理一直是让人颇为头疼的,各种方案层出不穷,这里博主介绍一个最近发现的非常好用的管理方案——`pyenv+pipenv` ## Homebrew 关于`homebrew`的介绍和优化,参见博文 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="http://blog.ruixiaolu.com/archives/16/" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.ruixiaolu.com/usr/uploads/20200312022439.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Homebrew——MacOS下的包管理神器</p> <div class="inster-summary text-muted"> 前言Homebrew(简称为brew)是Mac下的一个包管理工具,可以用它来安装管理许多Mac没有预装的软件程序,... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="http://blog.ruixiaolu.com/archives/17/" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(http://blog.ruixiaolu.com/usr/themes/handsome/assets/img/sj/2.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Homebrew 替换默认源</p> <div class="inster-summary text-muted"> brew如果不换成国内源,安装软件时候可能会出问题,不是安装不了就是速度很慢,所以使用它,更换国内游是比较好的选择... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> ## 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`执行以下命令 ```bash brew update && brew install pyenv ``` 以后升级`pyenv`时,可以使用 ```bash brew upgrade pyenv ``` 等`homebrew`将`pyenv`安装好后,我们需要改动一下环境变量 如果你用的是`oh-my-zsh`那么你应该使用以下命令 ```bash # 首先输入命令 vim ~/.zshrc # 然后在该文件最下面添加下面这一行 eval "$(pyenv init -)" # 按 esc, :wq 保存退出后,输入命令 source ~/.zshrc ``` 如果你使用的是其他终端,可以自行修改对应的配置文件,这里不一一列举了。 ### 用`pyenv`安装`python` 使用`pyenv`安装`python`十分简单,仅仅只有两条命令 ```bash pyenv install <版本号> pyenv rehash ``` 其中版本号可以用命令 ```bash pyenv install -l ``` 查看可用的版本 例如安装`python 3.8.2`就可以输入 ```bash pyenv install 3.8.2 && pyenv rehash ``` 等带安装完毕后,可以使用命令 ```bash pyenv versions ``` 查看当前系统安装的所有版本,并且查看当前所使用的版本 ```bash $ 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`中,有三种设置 ```bash pyenv global <版本号> # 用于设置整个系统里的python版本,也就是说如果没有特别设置下面两条命令,且没有进入虚拟环境中,那么使用的python版本就是global设置的版本 pyenv local <版本号> # 用于设置当前路径文件夹内的python版本,该设置会覆盖global设置 pyenv shell <版本号> # 用于设置当前终端的python版本,会覆盖以上两条设置 ``` 例如,你想在整个系统中使用3.6.5,而在某个文件夹下使用3.7.7 ```bash pyenv global 3.6.5 # cd path pyenv local 3.7.7 ``` 这样我们就使得不同的`python`版本在我们的电脑上共存。 ## `pipenv` `pipenv`是`python`官方推荐的包管理工具。 ### 安装 打开终端或者`iTerm`执行以下命令 ```bash brew update && brew install pipenv ``` 以后升级`pipenv`时,可以使用 ```bash brew upgrade pipenv ``` 等`homebrew`将`pipenv`安装好后,我们需要改动一下环境变量 如果你用的是`oh-my-zsh`那么你应该使用以下命令 ```bash # 首先输入命令 vim ~/.zshrc # 然后在该文件最下面添加下面这一行 export PIPENV_VENV_IN_PROJECT=1 # 按 esc, :wq 保存退出后,输入命令 source ~/.zshrc ``` 如果你使用的是其他终端,可以自行修改对应的配置文件,这里不一一列举了。 <div class="tip inlineBlock info"> 其实你也可以不加上面这一行,这一行的设置表示,创建的虚拟环境就在你当前的目录中,也就是说,你到某个文件夹中,创建虚拟环境后,虚拟环境就在当前目录的下的.venv文件夹中 </div> ### 新建虚拟环境 进入到项目目录中,输入以下命令 ```bash 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` ```bash pyenv install 3.8.2 ``` 其次创建项目目录然后创建虚拟环境 ```bash mkdir django_demo cd django_demo pipenv --python 3.8.2 ``` 然后安装项目依赖包 ```bash pipenv install django==2.2.10 pipenv install itsdangerous pipenv install requests ``` 此时查看`Pipfile` ```json [[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` ```json { "_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`查看包之间的依赖关系 ```bash $ 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] ``` 卸载包也很简单 ```bash pipenv uninstall itsdangerous ``` 在另一电脑上利用git复制项目后,可以用命令 ```bash pipenv install ``` 就可以安装该项目中的所有包了,并且会自动为项目创建虚拟环境。 如果有项目之前是使用requirements.txt的,可以用命令 ```bash pipenv install -r requirements.txt ``` 安装所有的依赖包。 最后修改:2020 年 10 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏