python建立虚拟环境,以及虚拟环境的理解

List of interpreters

注:VScode当前工作空间下的虚拟环境,比如上图的'env':venv,一定要等VScode选择解释器的下拉栏中出现确定的路径时选择之,而不是在资源管理器或Finder中指定虚拟环境的解释器venv_name/bin/python,后者的解释器是指向建立虚拟环境时("python -m venv -n venv_name")所用系统或conda的解释器的符号链接,选择符号链接本质上还是选择了系统或conda的解释器,那样的话当前工作空间下的虚拟环境的site-package不会被加到sys.path中,虚拟空间不参与系统或conda的环境。

参考自解决ubuntu16.04 无法使用python 建立虚拟环境(venv或virtualenv)的问题

        使用python3.8解释器,调用venv模块建立虚拟环境

        前提是安装了python3.8,如果调用"python3.8 -m venv name_venv"出错提示"Error: Command '['/home/haypin/PycharmProjects/learning_log/venv_3.8/bin/python3.8', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.",则可能是安装python3.8时没有安装匹配版本的venv包,sudo apt install python3.8-venv安装python3.8的venv包就好了,然后使用使用python3.8解释器调用venv模块建立虚拟环境的命令是python3.8 -m venv name_venv,

        关于虚拟环境,其实虚拟环境中提供的python命令与python3命令的可执行文件都是指向建立该虚拟环境时使用的python解释器的可执行文件的软链接,如下图我用python3.8 -m venv venv_3.8建立的虚拟环境venv_3.8分别提供了指向/usr/bin/python3.8的软链接pythonpython3,所以虚拟环境的意义还是为使用该虚拟环境的项目提供独立的包,也就是独立的环境,而不是将包下载安装到python解释器安装时的包目录(~/.local/lib/python3.6/site-packages/),那样就不符合为项目所在目录封装独立的环境了。

        虚拟环境直接提供了pip包管理器的可执行文件,从而可以像"pip3 install requests"这样直接执行执行pip3而不用"python3.8 -m pip install package_hame"这样的长命令。

补充1:

在python×.×解释器程序的man手册中介绍了"python3.8 -m module-name argutuments"——运行指定模块的main函数并提供参数的用法,提到"python解释器程序将从sys.path中查找命名的模块,并像一个脚本一样运行对应的.py文件",说明sys.path指示python解释器程序导包的路径。

关于"虚拟环境为使用该虚拟的项目提供独立的包",有更直观的体现就是虚拟环境中运行python解释器程序与不在虚拟环境中运行解释器程序时的导包路径变量sys.path发生了改变:

在进入由python3.8解释器程序建立的虚拟环境venv_3.8后,将导包路径sys.path中'/usr/local/lib/python3.8/dist-packages'与'/usr/lib/python3/dist-packages'替换成了虚拟环境的包目录的'/home/haypin/PycharmProjects/learning_log/venv_3.8/lib/python3.8/site-packages',这至少说明了虚拟环境中的项目将从其*/venv/lib/python×.×/site-packages包目录中导包。

补充2:

另外,虚拟环境下可执行文件的搜索路径$PATH最前面的目录也相应地修改为*/venv/bin/了,将首先查找虚拟环境的命令:

补充3:

在VScode官网文档中解释了python环境:

https://code.visualstudio.com/docs/python/environments

Python的一个环境是python程序运行的上下文(解释器路径、包查找路径、-m pip install 安装路径、环境变量等)

Global and virtual environments#

By default, any Python interpreter that you've installed runs in its own global environment, which is not specific to any one project. For example, if you just run python (Windows) or python3 (macOS/Linux) at a new command prompt, you're running in that interpreter's global environment. Accordingly, any packages that you install or uninstall affect the global environment and all programs that you run within that context.

Although working in the global environment is an easy way to get started, that environment will, over time, become cluttered with many different packages that you've installed for different projects. Such clutter makes it difficult to thoroughly test an application against a specific set of packages with known versions, which is exactly the kind of environment you'd set up on a build server or web server.

For this reason, developers often create a virtual environment for a project. A virtual environment is a subfolder in a project that contains a copy of a specific interpreter. When you activate the virtual environment, any packages you install are installed only in that environment's subfolder. When you then run a Python program within that environment, you know that it's running against only those specific packages. Be aware that if you're not using a virtual environment, and you have multiple versions of Python installed and set in the path environment variable, you might need to specify the Python interpreter to use in the terminal for installing packages to the global environment.

Note: While it's possible to open a virtual environment folder as a workspace, doing so is not recommended and might cause issues with using the Python extension.

Conda environments#

A conda environment is a Python environment that's managed using the conda package manager (see Getting started with conda (conda.io)). Conda works well to create environments with interrelated dependencies as well as binary packages. Unlike virtual environments, which are scoped to a project, conda environments are available globally on any given computer. This availability makes it easy to configure several distinct conda environments and then choose the appropriate one for any given project.

conda环境是使用conda包管理器的Python环境。Conda能很好地创建相关关联的依赖项以及二进制包的环境。与仅限于项目的venv虚拟环境不同,conda环境可在任何给定计算机上全局使用。这种可用性使配置多个不同的conda环境变得容易,然后为任何给定项目选择合适的环境。

 haypin@HaypinsMBP  ~/.local/bin  conda env list
# conda environments:
#
base                  *  /Users/haypin/miniconda3
Py3.9.5                  /Users/haypin/miniconda3/envs/Py3.9.5

 haypin@HaypinsMBP  ~/.local/bin  cd ~/miniconda3/envs
 haypin@HaypinsMBP  ~/miniconda3/envs  ls
Py3.9.5
 haypin@HaypinsMBP  ~/miniconda3/envs 

系统全局安装的解释器及其环境,只要可执行程序被加到PATH环境变量,则在系统全局可使用。conda环境需要conda activate env-name激活后可在系统全局使用,包路径就是创建的conda环境的site-packages,而虚拟环境需要source venv-dir/bin/activate激活后可在系统全局使用,包路径就是虚拟环境的site-packages,但一般都将虚拟环境放到项目的目录树下只在该项目中激活其虚拟环境。

(venv_mac)  haypin@HaypinsMBP  ~/catkin_ws/src/lift_strategy   fat ±  tree venv_mac
venv_mac
├── bin
│   ├── Activate.ps1
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── automat-visualize
│   ├── cftp
│   ├── chardetect
│   ├── ckeygen
│   ├── conch
│   ├── flask
│   ├── hypercorn
│   ├── mailmail
│   ├── pip
│   ├── pip3
│   ├── pip3.9
│   ├── pyhtmlizer
│   ├── python -> python3.9
│   ├── python3 -> python3.9
│   ├── python3.9 -> /Users/haypin/miniconda3/envs/Py3.9.5/bin/python3.9
│   ├── quart
│   ├── sqlformat
│   ├── tkconch
│   ├── trial
│   ├── twist
│   └── twistd
├── include
│   └── site
│       └── python3.9
│           └── greenlet
│               └── greenlet.h
├── lib
│   └── python3.9
│       └── site-packages
│           ├── Automat-20.2.0.dist-info
│           │   ├── INSTALLER
│           │   ├── LICENSE
│           │   ├── METADATA
│           │   ├── RECORD
│           │   ├── REQUESTED
│           │   ├── WHEEL
│           │   ├── entry_points.txt
│           │   └── top_level.txt
│           ├── Flask-1.1.2.dist-info

Python官网有解释虚拟环境:

https://docs.python.org/zh-cn/3/tutorial/venv.html

https://docs.python.org/3/library/venv.html

以及Python官网对安装模块的介绍都鼓励使用虚拟环境:

https://packaging.python.org/tutorials/installing-packages/

venv模块支持创建带有自己的本地目录的轻量级的虚拟环境,可选地,与系统目录隔离。没个虚拟环境有其自己的Python二进制可执行文件(与创建该虚拟环境时使用的版本的python二进制可执行文件相匹配),并且可以在其本地目录中存储其自己的、独立的、安装的Python包集合

可以通过执行venv包命令创建虚拟环境:

python3 -m venv /path/to/new/virtual/environment

运行该命令将创建目标目录(如果父目录不存在则创建父目录-p)并在其中放置pyvenv.cfg文件,其中有指向Python安装的home键,命令从该Python可执行程序运行。虚拟环境的常见目标目录是.venv。也会创建一个bin(在Windows下是Scripts)子目录包含Python二进制可执行文件的拷贝或符号链接(视平台或创建虚拟环境时使用的参数而定):

(Py3.9.5)  haypin@HaypinsMBP  ~/miniconda3/envs/Py3.9.5/bin  ll
total 15208
-rwxr-xr-x  1 root  staff   259B  7 11 18:35 pip
-rwxr-xr-x  1 root  staff   259B  7 11 18:35 pip3
lrwxr-xr-x  1 root  staff     8B  7 11 18:35 pydoc -> pydoc3.9
lrwxr-xr-x  1 root  staff     8B  7 11 18:35 pydoc3 -> pydoc3.9
-rwxrwxr-x  1 root  staff   111B  7 11 18:35 pydoc3.9
lrwxr-xr-x  1 root  staff     9B  7 11 18:35 python -> python3.9
lrwxr-xr-x  1 root  staff     9B  7 11 18:35 python3 -> python3.9
lrwxr-xr-x  1 root  staff    16B  7 11 18:35 python3-config -> python3.9-config
-rwxrwxr-x  1 root  staff   4.4M  7 11 18:35 python3.9

也会创建一个初始为空的lib/pythonX.Y/site-packages子目录(在Windows下是Lib\site-packages)。如果指定了一个已存在的目录,它将被重用。

(Py3.9.5)  haypin@HaypinsMBP  ~/PycProj/untitled/venv/lib/python3.8/site-packages  ll
total 16
drwxr-xr-x   3 haypin  staff    96B  9 30  2020 __pycache__
drwxr-xr-x   5 haypin  staff   160B  9 30  2020 _distutils_hack
-rw-r--r--   1 haypin  staff   152B  9 30  2020 distutils-precedence.pth
-rw-r--r--   1 haypin  staff   126B  9 30  2020 easy_install.py
drwxr-xr-x   7 haypin  staff   224B  9 30  2020 pip
drwxr-xr-x   9 haypin  staff   288B  9 30  2020 pip-20.2.3.dist-info
drwxr-xr-x   6 haypin  staff   192B  9 30  2020 pkg_resources
drwxr-xr-x  41 haypin  staff   1.3K  9 30  2020 setuptools
drwxr-xr-x  11 haypin  staff   352B  9 30  2020 setuptools-50.3.0.dist-info

Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,因为应用程序可能需要修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。

这意味着一个Python安装可能无法满足每个应用程序的要求。如果应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。

这个问题的解决方案是创建一个 virtual environment,就是一个目录树,其中安装有特定Python版本(允许链接到其他Python解释器应用程序),以及许多其他包。

用于创建和管理虚拟环境的模块称为 venvvenv 通常会安装你可用的最新版本的 Python。如果您的系统上有多个版本的 Python,您可以通过运行 python3 或您想要的任何版本来选择特定的Python版本。

1、要创建虚拟环境,请确定要放置它的目录,并将 venv 模块作为脚本运行目录路径,venv在Python3.3及以后版本默认自带。并且将安装pip和setuptools到创建的虚拟环境。

python3 -m venv <DIR># 这通常将在虚拟环境的bin子目录下建立一个指向特定版本Python解释器(python3.exe)的软连接
source <DIR>/bin/activate  

2、也可以使用conda(miniconda3、anaconda3)应用程序创建虚拟环境,与python -m venv 命令创建的虚拟环境目录结构一样,并且conda可以创建尚未在系统安装的Python版本的虚拟环境

参见:https://blog.csdn.net/HayPinF/article/details/118732101

3、virtualenv,默认总是将pip,setuptools和wheel安装到创建的虚拟环境。

python3 -m virtualenv <DIR>
source <DIR>/bin/activate

source命令保证虚拟环境的环境变量被设置在当前shell中,而不是source命令执行的自进程中(这将随source命令结束而消失)。

直接管理多个虚拟环境是乏味的,so the dependency management tutorial introduces a higher level tool, Pipenv, that automatically manages a separate virtual environment for each project and application that you work on.

venv_dir

|__bin

        |_activate

        |_activate.csh

        |_activate.fish

        |_python3.9

|__include

|__lib

|__pyvenv.cfg

如果 tutorial-env 目录不存在,它将为你创建一个,并在其中创建包含Python解释器标准库各种支持文件的副本的目录。

虚拟环境的常用目录位置是 .venv。 这个名称通常会令该目录在你的终端中保持隐藏,从而避免需要对所在目录进行额外解释的一般名称。 它还能防止与某些工具所支持的 .env 环境变量定义文件发生冲突。

创建虚拟环境后,您可以激活它。

在Windows上,运行:

tutorial-env\Scripts\activate.bat

在Unix或MacOS上,运行:

source tutorial-env/bin/activate

(这个脚本是为bash shell编写的。如果你使用 csh 或 fish shell,你应该改用 activate.csh 或 activate.fish 脚本。)

激活虚拟环境将改变你所用终端的提示符,以显示你正在使用的虚拟环境,并修改环境以使 python 命令所运行的将是已安装的特定 Python 版本(创建虚拟环境时所用的Python版本)。 例如:

$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值