Python版本管理
不同的python项目可能依赖不同的python解释器,想要在同一电脑上运行多个项目,就需要安装不同版本的Python。
pyenv是python版本管理工具,可以帮我们非常容易的管理多个版本的python。
本文只关注Mac电脑上的依赖管理。
安装pyenv
安装前的准备
非必须,但是官方强烈推荐的一些python构建依赖:
$ brew install openssl readline sqlite3 xz zlib
安装
使用Homebrew安装pyenv
$ brew install pyenv
安装后的配置
将pyenv init添加到shell中以启用shims和命令自动补全。确保eval "$(pyenv init -)"被放置在shell配置文件的末尾,因为它在初始化过程中操纵路径。
bash
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
zsh
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc
之后重启shell以使对PATH环境变量的修改生效
$ exec "$SHELL"
用pyenv安装python
查看当前可安装的python版本
$ pyenv install --list
安装
$ pyenv install 3.8.7
pyenv从python源代码构建python。安装后的python路径在~/.pyenv/versions/
下
切换python版本
查看当前已安装版本
$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
2.7.15
3.6.8
3.8-dev
前面带*的为当前active版本
切换版本
可以通过pyenv global
,pyenv local
或python shell
切换Python版本。
- pyenv global 属于全局切换,切换完成后,在系统中任何地方执行python,你会发现都是同样的Python版本。
$ pyenv gloabl 3.6.8
- pyenv local 执行后会在当前目录中生成一个.python-version文件。python版本只在当前目录及子目录中生效
$ pyenv local 3.6.8
- pyenv shell 设置当前shell session的python版本。执行后会给当前shell设置一个
PYENV_VERSION
环境变量
$ pyenv shell 3.6.8
切换后可执行python -V
来检查python版本
用pipenv创建虚拟环境
Pipenv是Python官方推荐的包管理工具, 也是一个虚拟环境管理工具。它综合了 virtualenv , pip 和 pyenv 三者的功能。你可以使用pipenv这一个工具来安装、卸载、跟踪和记录依赖,并创建、使用和组织你的虚拟环境。
安装pipenv
使用Homebrew
brew install pipenv
为项目创建虚拟环境
$ mkdir my_python_project
$ cd my_python_project
$ pipenv --python 3.8.6
这样就为项目初始化了一个Python 3.8.6的虚拟环境,并在项目录下生成一个项目依赖包文件Pipefile。如果系统中没有3.8.6版本的Python,pipenv会调用pyenv来安装对应的Python的版本。
默认地,虚拟环境会创建在~/.local/share/virtualenvs
目录里面。我们也可以通过pipenv --venv
查看项目的虚拟环境目录。可以通过 pipenv --rm
删除虚拟环境。
也可使用 pipenv install 创建虚拟环境
也可以使用pipenv install
创建虚拟环境和安装Pipfile中所包含的依赖包, 会自动生成一个保证确定性构建的文件Pipefile.lock。
激活和退出虚拟环境
激活虚拟环境
$ pipenv shell
在这个shell中,所使用的包版本将为当前虚拟环境中的包版本
退出,回到原来的shell session中
$ eixt
其他虚拟环境相关操作
查看当前项目路径
$ pipenv --where
查看当前虚拟环境的路径
$ pipenv --venv
查看当前python的信息
$ pipenv --py
Pipefile和Pipefile.lock
Pipfile
用于指定python应用程序或者库的包需求,包括开发和执行阶段。它应只包含项目的顶层依赖。
使用TOML语法编写。
例如:
[[source]] # 软件包源 (从哪里下载软件包)
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages] # 运行应用程序时所需要的软件包,及其版本
requests = "*"
flask = "*"
pandas = "*"
[dev-packages] # 开发应用程序时所需要的软件包
pylint = "*"
wheel = "*"
[requires] # Python版本
python_version = "3.6"
Pipfile.lock
支持确定性构建。根据Pipfile中存在的软件包来指定应使用的依赖及其子依赖的特定版本,从而避免了自动升级彼此依赖的软件包以及破坏项目依赖树的风险。
除了软件包的版本外,它还包含包的哈希值,以支持更安全的验证。
此文件的语法为JSON。
例如:
{
"_meta": {
...
},
"default": {
"flask": {
"hashes": [
"sha256:6c3130c8927109a08225993e4e503de4ac4f2678678ae211b33b519c622a7242",
"sha256:9dce4b6bfbb5b062181d3f7da8f727ff70c1156cbb4024351eafd426deb5fb88"
],
"version": "==0.12.1"
},
"requests": {
"editable": true,
"git": "https://github.com/requests/requests.git",
"ref": "4ea09e49f7d518d365e7c6f7ff6ed9ca70d6ec2e"
},
"werkzeug": {
"hashes": [
"sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b",
"sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c"
],
"version": "==0.14.1"
}
不推荐手动修改该文件。可以根据当前已安装的包来生成Pipefile.lock文件:
$ pipenv lock
该命令会查找当前的虚拟环境文件夹,根据当前已安装的包版本自动生成Pipefile.lock文件。
用pipenv管理项目依赖包
安装依赖包
例如,使用pipenv安装pytest
$ pipenv install pytest
安装dev dependency(开发应用程序时所需要的依赖)
$ pipenv install pytest --dev
安装Pipfile中的所有依赖
$ pipenv install
如果当前已有requirements.txt文件,会自动识别并转换为Pipfile文件。
也可以从requirements.txt文件中安装依赖
$ pipenv install -r requirements.txt
$ pipenv install -r requirements.txt --dev
注意:
默认情况下,我们都是在requirements.txt文件里指定了安装包的版本信息的,在导入requirements.txt文件时,版本信息也会被自动写Pipfile文件里, 但是这个信息我们一般不需要保存在Pipfile文件里,需要手动更新Pipfile来删除版本信息。
查看当前已安装的依赖包
用图的方式列出当前已安装的依赖包
$ pipenv graph
卸载依赖包
$ pipenv uninstall <package>