python虚拟环境的安装_Python虚拟环境实践

开发每个Python项目时,都推荐创建对应的virtualenv来隔离开发。 这样可以不受系统Python软件包的影响,安装任意包的任意版本,并且最终能通过pip freeze > requirements.txt获取依赖列表。当然,这个列表通常需要裁剪。

一、安装virtualenv

使用apt、yum等包管理器安装的版本老旧,推荐使用pip安装。

1python3.6 -m pip install virtualenv

二、准备virtualenv

每个项目,都需要独立创建一个(或多个)虚拟环境,隔离开发。

1virtualenv -p python3.6 venv

-p是显式指定Python版本,避免使用默认的python。

虚拟环境的常用名,可选择env、venv、.env、.venv。

1

2

3

4

5root@SS-DTA:/home/nbsprc# ls -alh

total 12K

drwxr-xr-x 3 root root 4.0K May 25 03:03 .

drwxr-xr-x 9 root root 4.0K May 25 02:52 ..

drwxr-xr-x 5 root root 4.0K May 25 03:03 venv

三、激活virtualenv

默认使用的是用户+系统环境,激活后才是虚拟环境。

1source venv/bin/activate

激活虚拟环境后,可以看到只有三个Python包。 这个环境可以随意使用,所有安装都会在./venv/下,不会影响系统环境。 干净的环境,也能帮助开发人员确认依赖。

1

2

3

4

5

6(venv) root@SS-DTA:/home/nbsprc# pip list

Package Version

---------- -------

pip 19.1.1

setuptools 41.0.1

wheel 0.33.4

在这个虚拟环境中,python就是python3.6,而系统环境的python通常是python2。 在安装软件时,直接使用pip,即可安装到虚拟环境中。 而不像一般状态下,要么加sudo提权([brew]或Windows环境下不用),要么安装时需要加–user,安装到用户目录下。

四、退出virtualenv1deactivate

退出后,回到用户+系统环境。

五、虚拟环境的原理

virtualenv是如何创建一个隔离的Python虚拟环境?这个环境有什么特点?

这个环境的特点:

Python版本固定。即使系统的Python升级了,虚拟环境中的仍然不受影响,保留开发状态。

所有Python软件包,都只在这个环境生效。一旦退出,则回到用户+系统的默认环境中。

这两个特点,由两个小手段实现。

改变当前Shell的PATH。

改变Python运行时的sys.path。

改变PATH1

2root@SS-DTA:/home/nbsprc# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

1

2(venv) root@SS-DTA:/home/nbsprc# echo $PATH

/home/nbsprc/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

显然,这个activate,为当前PATH增加了/home/nbsprc/venv/bin这个位置在最前方,因此虚拟环境中的可执行文件拥有最高优先级。 而lib与include,仅仅是bin下面的可执行文件做相对路径运算来寻找的位置。 所以,改变了PATH,就改变了很多事。

由于优先级最高,所以环境里的python、pip等,包括后来用pip安装的可执行文件,都使用的是venv下的。

改变sys.path1

2

3

4

5

6

7

8

9

10

11

12

13root@SS-DTA:/home/nbsprc# python3.6 -m site

sys.path = [

'/home/nbsprc',

'/usr/lib/python36.zip',

'/usr/lib/python3.6',

'/usr/lib/python3.6/lib-dynload',

'/usr/local/lib/python3.6/dist-packages',

'/usr/local/lib/python3.6/dist-packages/setuptools-41.0.1-py3.6.egg',

'/usr/lib/python3/dist-packages',

]

USER_BASE: '/root/.local' (exists)

USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)

ENABLE_USER_SITE: True

1

2

3

4

5

6

7

8

9

10

11

12(venv) root@SS-DTA:/home/nbsprc# python -m site

sys.path = [

'/home/nbsprc',

'/home/nbsprc/venv/lib/python36.zip',

'/home/nbsprc/venv/lib/python3.6',

'/home/nbsprc/venv/lib/python3.6/lib-dynload',

'/usr/lib/python3.6',

'/home/nbsprc/venv/lib/python3.6/site-packages',

]

USER_BASE: '/root/.local' (exists)

USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)

ENABLE_USER_SITE: False

可见,sys.path发生了翻天覆地的变化。 除了当前路径/root和标准库/usr/local/lib/python3.6被保留以外,其它位置都换成了venv下的。 这就是为什么pip list看不见什么软件包的原因,也是环境隔离的最大秘密。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值