前言
Python虚拟环境是一个强大而灵活的工具,它可以帮助我们管理项目的依赖包、隔离不同项目的开发环境,并优化代码的开发过程。本文将介绍Python虚拟环境的概念、用法和好处,并引导您逐步使用它来提高代码开发的效率。
什么是Python虚拟环境
Python虚拟环境是Python解释器的一个独立副本,它可以在同一台计算机上同时存在多个独立的Python开发环境。每个虚拟环境都有自己独立的Python解释器和安装的第三方包,这样可以实现项目之间的隔离。
为什么需要虚拟环境
在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.10。所有第三方的包都会被pip安装到Python3的site-packages目录下。
如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?
这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境。venv就是用来为一个应用创建一套“隔离”的Python运行环境。
虚拟环境的好处
- 隔离项目环境
通过创建独立的虚拟环境,我们可以确保不同项目间的依赖包不冲突,同时减少项目间可能出现的兼容性问题。 - 方便扩展和管理
通过虚拟环境,我们可以方便地安装、更新和删除项目所需的依赖包,而不会影响其他项目。 - 保持干净的开发环境
虚拟环境可以帮助我们保持开发环境的干净,减少不必要的依赖和冗余的包。
python常用的虚拟环境技术
- venv
venv是Python 3中自带的模块,用于创建和管理虚拟环境。通过运行以下命令可以创建一个新的虚拟环境:
- 创建虚拟环境的命令
使用windows doc命令切换到某个路径下,然后执行(请注意python是windows环境变量中配置的版本)
python -m venv ./myvenv
- 激活虚拟环境
windows在myevnv目录下Scripts\activate.bat
执行该脚本即可激活 - pycharm引入
此时电脑磁盘myvenv中自动创建出如下目录和文件:
- anaconda
- 创建python版本为3.x.xx,名字为conda_env的虚拟环境
conda create --name conda_env python=3.x.xx
这里有的小伙伴可能会出现如下错误:
(base) C:\Users\root>conda create --name conda_env python=3.7.14
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
- python=3.7.14
Current channels:
- https://repo.anaconda.com/pkgs/main/win-64
- https://repo.anaconda.com/pkgs/main/noarch
- https://repo.anaconda.com/pkgs/r/win-64
- https://repo.anaconda.com/pkgs/r/noarch
- https://repo.anaconda.com/pkgs/msys2/win-64
- https://repo.anaconda.com/pkgs/msys2/noarch
To search for alternate channels that may provide the conda package you're
looking for, navigate to
https://anaconda.org
and use the search bar at the top of the page.
这可能是因为没有可用的渠道提供该特定版本的Python。
解决思路:
- 更新Anaconda运行的Conda软件包管理器
conda update conda
如果更新Conda后还是不能找到所需版本的Python,那可能是因为该Python版本不是默认提供的。
2. 使用conda search python查看可用的Python版本列表
Loading channels: done
# Name Version Build Channel
python 2.7.13 h1b6d89f_16 pkgs/main
python 2.7.13 h9912b81_15 pkgs/main
python 2.7.13 hb034564_12 pkgs/main
python 2.7.14 h2765ee6_18 pkgs/main
python 2.7.14 h3e68818_15 pkgs/main
python 2.7.14 h4084c39_22 pkgs/main
python 2.7.14 h4a10d90_30 pkgs/main
python 2.7.14 h4a10d90_31 pkgs/main
python 2.7.14 h59f5a59_20 pkgs/main
python 2.7.14 h819644d_16 pkgs/main
python 2.7.14 h8c3f1cb_23 pkgs/main
python 2.7.15 h2880e7c_2 pkgs/main
python 2.7.15 h2880e7c_3 pkgs/main
python 2.7.15 h2880e7c_4 pkgs/main
python 2.7.15 hcb6e200_15 pkgs/main
python 2.7.15 hcb6e200_5 pkgs/main
python 2.7.15 hcb6e200_7 pkgs/main
python 2.7.15 he216670_0 pkgs/main
python 2.7.16 hcb6e200_0 pkgs/main
python 2.7.17 h930f6bb_0 pkgs/main
python 2.7.18 hcb6e200_0 pkgs/main
python 2.7.18 hfb89ab9_0 pkgs/main
python 3.5.4 h1357f44_23 pkgs/main
python 3.5.4 hc495aa9_21 pkgs/main
python 3.5.4 hd3c4935_11 pkgs/main
python 3.5.4 hdec4e59_20 pkgs/main
python 3.5.4 hedc2606_15 pkgs/main
python 3.5.5 h0c2934d_0 pkgs/main
python 3.5.5 h0c2934d_1 pkgs/main
python 3.5.5 h0c2934d_2 pkgs/main
python 3.5.6 he025d50_0 pkgs/main
python 3.6.2 h09676a0_15 pkgs/main
python 3.6.2 h6679aeb_11 pkgs/main
python 3.6.3 h210ce5f_2 pkgs/main
python 3.6.3 h3389d20_0 pkgs/main
python 3.6.3 h3b118a2_4 pkgs/main
python 3.6.3 h9e2ca53_1 pkgs/main
python 3.6.4 h0c2934d_2 pkgs/main
python 3.6.4 h0c2934d_3 pkgs/main
python 3.6.4 h6538335_0 pkgs/main
python 3.6.4 h6538335_1 pkgs/main
python 3.6.5 h0c2934d_0 pkgs/main
python 3.6.6 hea74fb7_0 pkgs/main
python 3.6.7 h33f27b4_0 pkgs/main
python 3.6.7 h33f27b4_1 pkgs/main
python 3.6.7 h9f7ef89_2 pkgs/main
python 3.6.8 h9f7ef89_0 pkgs/main
python 3.6.8 h9f7ef89_1 pkgs/main
python 3.6.8 h9f7ef89_7 pkgs/main
python 3.6.9 h5500b2f_0 pkgs/main
python 3.6.10 h9f7ef89_0 pkgs/main
python 3.6.10 h9f7ef89_1 pkgs/main
python 3.6.10 h9f7ef89_2 pkgs/main
python 3.6.12 h5500b2f_2 pkgs/main
python 3.6.13 h3758d61_0 pkgs/main
python 3.7.0 hea74fb7_0 pkgs/main
python 3.7.1 h33f27b4_3 pkgs/main
python 3.7.1 h33f27b4_4 pkgs/main
python 3.7.1 h8c8aaf0_6 pkgs/main
python 3.7.1 he44a216_5 pkgs/main
python 3.7.2 h8c8aaf0_0 pkgs/main
python 3.7.2 h8c8aaf0_10 pkgs/main
python 3.7.2 h8c8aaf0_2 pkgs/main
python 3.7.3 h8c8aaf0_0 pkgs/main
python 3.7.3 h8c8aaf0_1 pkgs/main
python 3.7.4 h5263a28_0 pkgs/main
python 3.7.5 h8c8aaf0_0 pkgs/main
python 3.7.6 h60c2a47_2 pkgs/main
python 3.7.7 h60c2a47_0_cpython pkgs/main
python 3.7.7 h60c2a47_2 pkgs/main
python 3.7.7 h81c818b_4 pkgs/main
python 3.7.9 h60c2a47_0 pkgs/main
python 3.7.10 h6244533_0 pkgs/main
python 3.7.11 h6244533_0 pkgs/main
python 3.7.13 h6244533_0 pkgs/main
python 3.7.13 h6244533_1 pkgs/main
python 3.7.15 h6244533_0 pkgs/main
python 3.7.15 h6244533_1 pkgs/main
python 3.7.16 h6244533_0 pkgs/main
python 3.8.0 hff0d562_0 pkgs/main
python 3.8.0 hff0d562_1 pkgs/main
python 3.8.0 hff0d562_2 pkgs/main
python 3.8.1 h5fd99cc_1 pkgs/main
python 3.8.1 h5fd99cc_8_cpython pkgs/main
python 3.8.1 he1778fa_7_cpython pkgs/main
python 3.8.2 h5fd99cc_0 pkgs/main
python 3.8.2 h5fd99cc_11 pkgs/main
python 3.8.2 he1778fa_13 pkgs/main
python 3.8.3 he1778fa_0 pkgs/main
python 3.8.3 he1778fa_2 pkgs/main
python 3.8.5 h5fd99cc_1 pkgs/main
python 3.8.5 he1778fa_0 pkgs/main
python 3.8.8 hdbf39b2_4 pkgs/main
python 3.8.8 hdbf39b2_5 pkgs/main
python 3.8.10 hdbf39b2_7 pkgs/main
python 3.8.11 h6244533_1 pkgs/main
python 3.8.12 h6244533_0 pkgs/main
python 3.8.13 h6244533_0 pkgs/main
python 3.8.13 h6244533_1 pkgs/main
python 3.8.15 h6244533_1 pkgs/main
python 3.8.15 h6244533_2 pkgs/main
python 3.8.15 h82bb817_0 pkgs/main
python 3.8.16 h1aa4202_4 pkgs/main
python 3.8.16 h6244533_2 pkgs/main
python 3.8.16 h6244533_3 pkgs/main
python 3.8.17 h1aa4202_0 pkgs/main
python 3.8.17 h6244533_0 pkgs/main
python 3.9.0 h6244533_2 pkgs/main
python 3.9.0 h8aef87e_1 pkgs/main
python 3.9.1 h6244533_2 pkgs/main
python 3.9.2 h6244533_0 pkgs/main
python 3.9.4 h6244533_0 pkgs/main
python 3.9.5 h6244533_3 pkgs/main
python 3.9.6 h6244533_0 pkgs/main
python 3.9.6 h6244533_1 pkgs/main
python 3.9.7 h6244533_1 pkgs/main
python 3.9.11 h6244533_1 pkgs/main
python 3.9.11 h6244533_2 pkgs/main
python 3.9.12 h6244533_0 pkgs/main
python 3.9.13 h6244533_1 pkgs/main
python 3.9.13 h6244533_2 pkgs/main
python 3.9.15 h6244533_0 pkgs/main
python 3.9.15 h6244533_1 pkgs/main
python 3.9.15 h6244533_2 pkgs/main
python 3.9.16 h1aa4202_3 pkgs/main
python 3.9.16 h6244533_0 pkgs/main
python 3.9.16 h6244533_1 pkgs/main
python 3.9.16 h6244533_2 pkgs/main
python 3.9.17 h1aa4202_0 pkgs/main
python 3.9.17 h6244533_0 pkgs/main
python 3.10.0 h96c0403_3 pkgs/main
python 3.10.0 hbb2ffb3_0 pkgs/main
python 3.10.0 hbb2ffb3_1 pkgs/main
python 3.10.0 hbb2ffb3_2 pkgs/main
python 3.10.3 hbb2ffb3_5 pkgs/main
python 3.10.4 hbb2ffb3_0 pkgs/main
python 3.10.6 hbb2ffb3_0 pkgs/main
python 3.10.6 hbb2ffb3_1 pkgs/main
python 3.10.8 h966fe2a_1 pkgs/main
python 3.10.8 hbb2ffb3_0 pkgs/main
python 3.10.9 h966fe2a_0 pkgs/main
python 3.10.9 h966fe2a_1 pkgs/main
python 3.10.9 h966fe2a_2 pkgs/main
python 3.10.10 h966fe2a_2 pkgs/main
python 3.10.11 h966fe2a_2 pkgs/main
python 3.10.11 he1021f5_3 pkgs/main
python 3.10.12 h966fe2a_0 pkgs/main
python 3.10.12 he1021f5_0 pkgs/main
python 3.11.0 h966fe2a_2 pkgs/main
python 3.11.0 h966fe2a_3 pkgs/main
python 3.11.2 h966fe2a_0 pkgs/main
python 3.11.3 h966fe2a_0 pkgs/main
python 3.11.3 he1021f5_1 pkgs/main
python 3.11.4 h966fe2a_0 pkgs/main
python 3.11.4 he1021f5_0 pkgs/main
此时可以清楚的看到可以安装的python版本中根本没有3.7.14,可以换一个版本进行安装。
有个人说,我就要3.7.14,其它都不要。好吧,那你可以尝试添加其他渠道来获取所需的Python版本。你可以搜索可用的渠道,然后使用conda install -c <channel_name> python=命令来安装指定版本的Python。
- 激活、禁用 Python 环境
conda activate env_name
conda deactivate
- 安装和管理项目所需要的库
conda activate env_name ## 激活当前环境,使用pip命令就是给当前环境安装所需要的包
pip install xxx
- 列出可用环境
conda info --envs或者codna env list
(base) C:\Users\root>conda info --envs
# conda environments:
#
conda_env C:\Users\root\.conda\envs\conda_env
base * D:\data\anaconda
有的人会说,你这个虚拟环境能不能不要安装到C盘的默认路径了啊,可以更换磁盘吗?
是的,conda create --name <env_name> python=<version>
命令可以创建一个指定版本的Python虚拟环境,并且你也可以指定安装的目录位置。
要指定虚拟环境的安装目录,可以使用--prefix
参数,后面跟上你想要指定的目录路径。例如:
conda create --name <env_name> python=<version> --prefix=/path/to/installation/directory
在这个命令中,将/path/to/installation/directory
替换为你想要安装虚拟环境的目录路径。
这样,虚拟环境将被安装在指定的目录中,而不是默认的环境目录。确保目录存在并且你具有适当的权限来在该目录中安装虚拟环境。
- 移除虚拟环境
conda remove --name <env_name> --all
(base) C:\Users\root>conda remove --name conda_env --all
Remove all packages in environment C:\Users\root\.conda\envs\conda_env:
## Package Plan ##
environment location: C:\Users\root\.conda\envs\conda_env
The following packages will be REMOVED:
ca-certificates-2023.05.30-haa95532_0
certifi-2022.12.7-py37haa95532_0
openssl-1.1.1v-h2bbff1b_0
pip-22.3.1-py37haa95532_0
python-3.7.11-h6244533_0
setuptools-65.6.3-py37haa95532_0
sqlite-3.41.2-h2bbff1b_0
vc-14.2-h21ff451_1
vs2015_runtime-14.27.29016-h5e58377_2
wheel-0.38.4-py37haa95532_0
wincertstore-0.2-py37haa95532_2
Proceed ([y]/n)? y
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(base) C:\Users\root>conda env list
# conda environments:
#
base * D:\data\anaconda
(base) C:\Users\xue.chuan>
- virtualenv
- 安装virtualenv
virtualenv 是一个通过创建独立的 Python 环境来管理 Python 应用程序包的工具。
pip install virtualenv
- 创建和激活虚拟环境
在需要进行开发的目录中执行以下命令来创建一个 Python 环境
virtualenv env_name
其中 env_name 是新Python环境的名称。在创建好 Python 环境后再在命令行中使用以下命令激活环境:
source env_name/bin/activate
- 安装和管理项目所需的库
在虚拟环境激活后,使用 pip 安装所需的 Python 库
pip install xxx
- 退出虚拟环境
使用以下命令来退出虚拟环境
deactivate
导出和导入虚拟环境
有时候,我们需要将当前的虚拟环境分享给其他开发人员或者迁移到其他机器上。我们可以使用以下命令将当前的虚拟环境导出为一个压缩文件:
pip freeze > requirements.txt
然后,我们可以使用以下命令将该压缩文件导入到其他机器上:
pip install -r requirements.txt
这将会自动安装虚拟环境中所需的依赖包。
后记
Python虚拟环境是提高代码开发效率和管理依赖包的利器。通过使用虚拟环境,我们能够实现依赖包的隔离和项目环境的管理,保持开发环境的清洁和稳定。希望本文能够帮助读者理解和使用Python虚拟环境,并在项目开发中获得更好的体验。