一,虚拟环境
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