第七章虚拟环境
介于第六章的分发 过于复杂,先学了第七章吧。
与Python打交道免不了需要很多依赖的问题,如:
1 系统中没有需要的库
2系统中没有需要的库的正确版本
3 对两个不同的应用程序可能需要同一个库的两个不同版本。
这里书上分为了2种虚拟环境一种是第三方的库:virtualenv 另一种是venv,自带的。
因为venv建立的环境不会自带pip,跟setuptools ,所以我主要学习另一个virtualenv
1 安装虚拟环境库
pip install virtualenv
结果卡在这里好久,才发现环境库版本太高,配不上python3.37版本
这里应该
pip install virtualenv==16.4.3
2 创建虚拟环境库(名字随意)
virtualenv venv
3进入环境
liunx 版本的
source venv/bin/activate
windows 版本的就只能是通过路径直接启动了
C:\Users\Administrator\PycharmProjects\多线程练习
\venv\Scripts\activate
4退出环境
deactivate
另一个环境命令
创建环境
python -m venv myvenv
其他的跟上面的一样
结论,到3.7版本之后二者其实没多大区别了,甚至以为python跟库的版本不匹配,virtualenv 居然没有venv这个内置库好用,这是万万没想到的。
到此高手之路第七章学习完毕。
深入思考,参考其他资料,留待以后,下面的东西未来我应该用得到吧。
感兴趣的可以看下去,不感兴趣的可以过,跟高手之路关系不大了。
虚拟环境原理
1改变当前Shell的PATH
。
2改变Python运行时的sys.path
。
这里的PATH应该指的是系统path全局路径,这里临时修改成了第一项为本目录下的python晨曦
,而这里的sys,path修改,则指的是修改替换了sys.path里面的路径为虚拟环境路面的路径
以下为python:alpine
镜像中,以root
用户演示的例子。
改变PATH
首先看一下它的目录结构:
# ls venv
bin include lib
# ls /usr/local
bin include lib share
环境内所有的新内容,都在这个新生成目录下。 bin
是可执行文件的位置,include
是C/C++的头文件位置,lib
是库文件位置。 它和/usr/local
内的主要目录几乎相同,也和~/.local
下类似。
魔法都在两个PATH
中。
# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# . venv/bin/activate
(venv) # echo $PATH
/root/venv/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
显然,这个activate
,为当前PATH
增加了venv/bin
这个位置在最前方,因此虚拟环境中的可执行文件拥有最高优先级。 而lib
与include
,仅仅是bin
下面的可执行文件做相对路径运算来寻找的位置。 所以,改变了PATH
,就改变了很多事。
# ls -hl venv/bin/
total 88
-rw-r--r-- 1 root root 2.0K Mar 31 08:06 activate
-rw-r--r-- 1 root root 1.1K Mar 31 08:06 activate.csh
-rw-r--r-- 1 root root 3.0K Mar 31 08:06 activate.fish
-rw-r--r-- 1 root root 1.5K Mar 31 08:06 activate.ps1
-rw-r--r-- 1 root root 986 Mar 31 08:06 activate.xsh
-rw-r--r-- 1 root root 1.5K Mar 31 08:06 activate_this.py
-rwxr-xr-x 1 root root 238 Mar 31 08:06 easy_install
-rwxr-xr-x 1 root root 238 Mar 31 08:06 easy_install-3.7
-rwxr-xr-x 1 root root 220 Mar 31 08:06 pip
-rwxr-xr-x 1 root root 220 Mar 31 08:06 pip3
-rwxr-xr-x 1 root root 220 Mar 31 08:06 pip3.7
-rwxr-xr-x 1 root root 35.8K Mar 31 08:06 python
-rwxr-xr-x 1 root root 2.3K Mar 31 08:06 python-config
lrwxrwxrwx 1 root root 6 Mar 31 08:06 python3 -> python
lrwxrwxrwx 1 root root 6 Mar 31 08:06 python3.7 -> python
-rwxr-xr-x 1 root root 216 Mar 31 08:06 wheel
由于优先级最高,所以环境里的python
、pip
等,包括后来用pip
安装的可执行文件,都使用的是venv
下的。
改变sys.path
(venv) # python -m site
sys.path = [
'/root',
'/root/venv/lib/python37.zip',
'/root/venv/lib/python3.7',
'/root/venv/lib/python3.7/lib-dynload',
'/usr/local/lib/python3.7',
'/root/venv/lib/python3.7/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.7/site-packages' (doesn't exist)
ENABLE_USER_SITE: False
(venv) # deactivate
# python -m site
sys.path = [
'/root',
'/usr/local/lib/python37.zip',
'/usr/local/lib/python3.7',
'/usr/local/lib/python3.7/lib-dynload',
'/usr/local/lib/python3.7/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.7/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
可见,sys.path
发生了翻天覆地的变化。 除了当前路径/root
和标准库/usr/local/lib/python3.7
被保留以外,其它位置都换成了venv
下的。 这就是为什么pip list
看不见什么软件包的原因,也是环境隔离的最大秘密。
这玩意应该有更大的用处吧。。。
网友评论