第十三章[管理]:13.2:venv虚拟环境

本文详细介绍了Python的venv虚拟环境,包括其作用、特点、创建、激活、安装与管理库、退出与删除环境、检测环境差异、指定不同Python版本以及环境的迁移。通过venv,可以实现Python环境的隔离,便于管理和测试不同版本的包。
摘要由CSDN通过智能技术生成

一,虚拟环境

1,虚拟环境是什么?

venv是Python的一个标准库,用于创建和管理虚拟环境。
虚拟环境是Python的一个隔离空间,在这个空间中,
你可以安装和管理Python包,而不会影响到系统中的其他Python环境。
2,虚拟环境的特点:

隔离性:每个虚拟环境都有自己的Python解释器/独立的站点包(site-packages)目录。
在虚拟环境中安装或卸载的Python包不会影响到其他虚拟环境,
也不会影响到系统级别的Python环境。

创建和管理方便venv提供了简单的命令来创建、激活和关闭虚拟环境。
你可以在需要的时候快速创建一个新的虚拟环境,进行包的安装和测试,
在不需要的时候将其删除即可。

版本管理:使用虚拟环境,你可以在不同的环境中安装和使用不同版本的Python包,
这对于开发和测试兼容性问题非常有用。

二,创建虚拟环境

# 第二个venv是虚拟环境的目录名

root@lhdpc:/data/python/tutorial/hello# python3 -m venv venv

项目目录下创建了venv,查看目录

root@lhdpc:/data/python/tutorial/hello# ls
hello.py  venv

查看目录的大小:

root@lhdpc:/data/python/tutorial/hello# du -sh venv/
23M     venv/

三,激活

root@lhdpc:/data/python/tutorial/hello# source venv/bin/activate
(venv) root@lhdpc:/data/python/tutorial/hello#

四,操作venv:

1,安装库:

安装前查看已安装库的列表:

(venv) root@lhdpc:/data/python/tutorial/hello# pip list
Package    Version
---------- -------
pip        23.2
setuptools 68.1.2

安装:

  (venv) root@lhdpc:/data/python/tutorial/hello# pip install numpy

安装完成后,查看是否安装到了虚拟环境的目录下:
可以看到已安装到了python3.11/site-packages/目录下

(venv) root@lhdpc:/data/hello# ls venv/lib/python3.11/site-packages/
_distutils_hack           numpy-1.26.2.dist-info  pip-23.2.dist-info  
setuptools-68.1.2.dist-info
distutils-precedence.pth  numpy.libs              pkg_resources
numpy                     pip                     setuptools

安装后查看已安装库的列表:可以看到numpy库了

(venv) root@lhdpc:/data/python/tutorial/hello# pip list
Package    Version
---------- -------
numpy      1.26.2
pip        23.2
setuptools 68.1.2

安装后查看第三方库的详情:

(venv) root@lhdpc:/data/python/tutorial/hello# pip show numpy
Name: numpy
Version: 1.26.2
Summary: Fundamental package for array computing in Python
Home-page: https://numpy.org
Author: Travis E. Oliphant et al.
Author-email:  
License: Copyright (c) 2005-2023, NumPy Developers.
All rights reserved.
...
Location: /data/python/tutorial/hello/venv/lib/python3.11/site-packages
Requires:  
Required-by:

从Location可以看到第三方库所安装的位置,
确实位于hello项目的venv目录下

2,运行程序:

numtest.py的代码:

import numpy

a = numpy.array([1,2,3])
print(a)

在虚拟环境运行代码:

(venv) root@lhdpc:/data/python/tutorial/hello# python3 numtest.py  
[1 2 3]

五,退出:

(venv) root@lhdpc:/data/python/tutorial/hello# deactivate  
root@lhdpc:/data/python/tutorial/hello#

六,删除:

直接rm删除venv创建的目录即可

root@lhdpc:/data/python/tutorial/hello# ls
hello.py  venv
root@lhdpc:/data/python/tutorial/hello# rm -rf venv/
root@lhdpc:/data/python/tutorial/hello# ls
hello.py

七,检测是否使用虚拟环境的区别

代码:

import site
import sys

print(sys.prefix)   # 打印python程序安装路径
print(site.getsitepackages())  # 打印第三方库安装路径

未使用虚拟环境的运行结果:

liuhongdi@192 demo2 % python3 sysinfo.py 
/Library/Frameworks/Python.framework/Versions/3.12
['/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages']

使用了虚拟环境的运行结果:(pycharm中)

/Users/liuhongdi/python_work/tutorial/demo1/venv
['/Users/liuhongdi/python_work/tutorial/demo1/venv/lib/python3.12/site-packages']

在创建虚拟环境时,使用指定的python版本即可

八,venv指定使用不同的python版本

1,查看已安装的两个版本

查看已安装的两个python版本,/usr/bin目录下是linux自带,
/usr/local/soft/目录下是手动安装

liuhongdi@lhdpc:~$ /usr/local/soft/python3.12/bin/python3 --version
Python 3.12.0
liuhongdi@lhdpc:~$ /usr/bin/python3 --version
Python 3.11.6

2,分别用不同的版本创建虚拟环境

liuhongdi@lhdpc:/data/python/tutorial/hello2$ /usr/local/soft/python3.12/bin/python3 -m venv env312
liuhongdi@lhdpc:/data/python/tutorial/hello2$ /usr/bin/python3 -m venv env311

3,查看两个虚拟环境中可执行文件的区别:

分别链接到创建时的python版本

liuhongdi@lhdpc:/data/python/tutorial/hello2$ ll env311/bin/python3
lrwxrwxrwx 1 liuhongdi liuhongdi 16 11月 22 08:58 env311/bin/python3 -> /usr/bin/python3*
liuhongdi@lhdpc:/data/python/tutorial/hello2$ ll env312/bin/python3
lrwxrwxrwx 1 liuhongdi liuhongdi 38 11月 22 08:58 env312/bin/python3 -> /usr/local/soft/python3.12/bin/python3*

4,分别使用上面创建的两个虚拟环境

编写一个脚本:sysinfo.py,保存到我们的项目下

import site
import sys

print(sys.prefix)   # 打印python程序安装路径
print(site.getsitepackages())  # 打印第三方库安装路径

进入env312这个虚拟环境执行

liuhongdi@lhdpc:/data/python/tutorial/hello2$ source env312/bin/activate 
(env312) liuhongdi@lhdpc:/data/python/tutorial/hello2$ python3 --version
Python 3.12.0
(env312) liuhongdi@lhdpc:/data/python/tutorial/hello2$ python3 sysinfo.py  
/data/python/tutorial/hello2/env312
['/data/python/tutorial/hello2/env312/lib/python3.12/site-packages']
(env312) liuhongdi@lhdpc:/data/python/tutorial/hello2$ deactivate

进入env311这个虚拟环境执行

liuhongdi@lhdpc:/data/python/tutorial/hello2$ source env311/bin/activate 
(env311) liuhongdi@lhdpc:/data/python/tutorial/hello2$ python3 --version
Python 3.11.6
(env311) liuhongdi@lhdpc:/data/python/tutorial/hello2$ python3 sysinfo.py  
/data/python/tutorial/hello2/env311
['/data/python/tutorial/hello2/env311/lib/python3.11/site-packages', 
'/data/python/tutorial/hello2/env311/local/lib/python3.11/dist-packages',
 '/data/python/tutorial/hello2/env311/lib/python3/dist-packages', 
'/data/python/tutorial/hello2/env311/lib/python3.11/dist-packages']
(env311) liuhongdi@lhdpc:/data/python/tutorial/hello2$ deactivate

通过程序的输出信息,可以看到,
在不同的虚拟环境下,python的版本和第三方库的路径分别对应着不同的虚拟环境目录

九,venv的迁移

1,本地设备上的迁移
我们可以新创建一个虚拟环境,
然后把原目录下的lib目录复制到新项目的目录下

例如:从demo1目录下复制到demo2目录下:

新建虚拟环境,第二个venv是虚拟环境的目录名

liuhongdi@192 demo2 % python3 -m venv venv

查看项目目录下,虚拟环境的目录venv已经创建好

liuhongdi@192 demo2 % ls
__pycache__	hello.py	mod_demo2.py	pack3		sysinfo.py	venv

进入虚拟环境目录

liuhongdi@192 demo2 % cd venv
liuhongdi@192 venv % ls
bin		include		lib		pyvenv.cfg

给原来的lib目录改名,
然后把demo1下的lib目录复制到此venv目录下

liuhongdi@192 venv % mv lib lib.bak
liuhongdi@192 venv % cp -axv ../../demo1/venv/lib ./

测试demo2下的虚拟环境是否可用

liuhongdi@192 venv % cd ../
liuhongdi@192 demo2 % source venv/bin/activate
(venv) liuhongdi@192 demo2 % 
(venv) liuhongdi@192 demo2 % pip3 list
Package            Version
------------------ ----------
certifi            2023.11.17
charset-normalizer 3.3.2
idna               3.6
mypy               1.8.0
mypy-extensions    1.0.0
numpy              1.26.4
pip                23.2.1
PyYAML             6.0.1
requests           2.31.0
typing_extensions  4.9.0
urllib3            2.1.0

[notice] A new release of pip is available: 23.2.1 -> 24.0
[notice] To update, run: pip install --upgrade pip
(venv) liuhongdi@192 demo2 % pip3 show numpy
Name: numpy
Version: 1.26.4
Summary: Fundamental package for array computing in Python
Home-page: https://numpy.org
Author: Travis E. Oliphant et al.
...

2,跨设备的迁移

在源项目的虚拟环境目录下执行:

说明:参数: -l, –local                
If in a virtualenv that has global access, do not output globally-installed packages.
不输出全局安装的包

freeze: Output installed packages in requirements format.
按需要的格式输出已安装的包

(venv) liuhongdi@192 demo1 % pip3 freeze -l > packages.txt

查看生成的packages.txt

(venv) liuhongdi@192 demo1 % more packages.txt 
certifi==2023.11.17
charset-normalizer==3.3.2
idna==3.6
mypy==1.8.0
mypy-extensions==1.0.0
numpy==1.26.4
PyYAML==6.0.1
requests==2.31.0
typing_extensions==4.9.0
urllib3==2.1.0

在目标设备上的项目目录下创建虚拟环境

liuhongdi@192 demo3 % python3 -m venv venv

进入虚拟环境:

liuhongdi@192 demo3 % source venv/bin/activate
(venv) liuhongdi@192 demo3 % 

把源设备上生成的packages.txt也复制到目标设备的项目目录下,
执行包的导入:

(venv) liuhongdi@192 demo3 % pip3 install -r packages.txt
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting certifi==2023.11.17 (from -r packages.txt (line 1))
  Downloading https://mirrors.aliyun.com/pypi/packages/64/62/428ef076be88fa93716b576e4a01f919d25968913e817077a386fcbe4f42/certifi-2023.11.17-py3-none-any.whl (162 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 162.5/162.5 kB 2.1 MB/s eta 0:00:00
Collecting charset-normalizer==3.3.2 (from -r packages.txt (line 2))
  Downloading https://mirrors.aliyun.com/pypi/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl (122 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 122.2/122.2 kB 1.9 MB/s eta 0:00:00
Collecting idna==3.6 (from -r packages.txt (line 3))
  Downloading https://mirrors.aliyun.com/pypi/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.6/61.6 kB 3.3 MB/s eta 0:00:00
Collecting mypy==1.8.0 (from -r packages.txt (line 4))
  Downloading https://mirrors.aliyun.com/pypi/packages/08/24/83d9e62ab2031593e94438fdbfd2c32996f4d818be26d2dc33be6870a3a0/mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl (10.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.8/10.8 MB 6.4 MB/s eta 0:00:00
Collecting mypy-extensions==1.0.0 (from -r packages.txt (line 5))
  Downloading https://mirrors.aliyun.com/pypi/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)
Collecting numpy==1.26.4 (from -r packages.txt (line 6))
  Downloading https://mirrors.aliyun.com/pypi/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl (20.3 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.3/20.3 MB 6.2 MB/s eta 0:00:00
Collecting PyYAML==6.0.1 (from -r packages.txt (line 7))
  Downloading https://mirrors.aliyun.com/pypi/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl (178 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 178.7/178.7 kB 2.2 MB/s eta 0:00:00
Collecting requests==2.31.0 (from -r packages.txt (line 8))
  Downloading https://mirrors.aliyun.com/pypi/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.6/62.6 kB 3.5 MB/s eta 0:00:00
Collecting typing_extensions==4.9.0 (from -r packages.txt (line 9))
  Downloading https://mirrors.aliyun.com/pypi/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl (32 kB)
Collecting urllib3==2.1.0 (from -r packages.txt (line 10))
  Downloading https://mirrors.aliyun.com/pypi/packages/96/94/c31f58c7a7f470d5665935262ebd7455c7e4c7782eb525658d3dbf4b9403/urllib3-2.1.0-py3-none-any.whl (104 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.6/104.6 kB 4.9 MB/s eta 0:00:00
Installing collected packages: urllib3, typing_extensions, PyYAML, numpy, mypy-extensions, idna, charset-normalizer, certifi, requests, mypy
Successfully installed PyYAML-6.0.1 certifi-2023.11.17 charset-normalizer-3.3.2 idna-3.6 mypy-1.8.0 mypy-extensions-1.0.0 numpy-1.26.4 requests-2.31.0 typing_extensions-4.9.0 urllib3-2.1.0

[notice] A new release of pip is available: 23.2.1 -> 24.0
[notice] To update, run: pip install --upgrade pip

测试效果:用pip3 list查看效果:

(venv) liuhongdi@192 demo3 % pip3 list
Package            Version
------------------ ----------
certifi            2023.11.17
charset-normalizer 3.3.2
idna               3.6
mypy               1.8.0
mypy-extensions    1.0.0
numpy              1.26.4
pip                23.2.1
PyYAML             6.0.1
requests           2.31.0
typing_extensions  4.9.0
urllib3            2.1.0

[notice] A new release of pip is available: 23.2.1 -> 24.0
[notice] To update, run: pip install --upgrade pip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘你真牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值