开发环境:Ubuntu16.04 Pycharm 2018.3 Python3.7
以前使用Pycharm一直不了解项目下面的venv文件夹的作用。这些天搭建服务器的开发环境,有一个场景是每个用户可能使用不同的packages,如果每个用户都把个人的packages安装到base interpreter中,容易引起兼容性问题。那如何避免呢?原来Pycharm可以为每个project建立一个虚拟的环境,能将当前项目使用的packages与base interpreter中的packages隔离,当前项目使用的packages和interpreter就在venv文件夹下面。
在Pycharm中创建虚拟环境需要指定虚拟文件的目录以及使用的base interpreter,可以选择是否“inherit global site-packages”。如果勾选“inherit global site-packages”,在该虚拟环境下,我们可以使用base interpreter的所有packages;反之无法调用base interpreter的packages。
这样会带来一个新问题:如果没有勾选“inherit from global site-packages”,我们需要的且已在base interpreter安装的packages,要在虚拟环境下使用pip/python install/easy_install重新安装一次;如果勾选了“inherit from global site-packages”,在虚拟环境中使用pip/python install/easy_install/等安装本项目使用packages时,将会直接安装到base interpreter的site-packages中,从而失去了创建虚拟环境的意义,容易导致兼容性问题。
其实我们的需求很简单,即在虚拟环境中能够使用base interpreter的所有packages,同时在虚拟环境中安装packages不会对base interpreter产生影响。
怎么样实现我们的需求呢?对比图3和图4,我们不难发现,不勾选“inherit global site-packages”时,venv的目录中时含有pip文件的;而不勾选“inherit global site-packages”,venv的目录中不含有pip,我们可以推断,在这种情况下使用pip,将会调用base interpreter中的pip命令,故将packages安装到base interpreter的site-packages,从而产生了“污染”。
本着“缺啥补啥”的精神,即使设置了“inherit global site-packages”,我们可以在venv下的bin目录中安装pip(注意安装时请使用该目录的python运行get-pip.py)
接下来,我们验证一下,使用该pip安装cltk是否会“污染”base interpreter的site-packages。
至此,在虚拟环境中设置了“inherit global site-packages”,我们可以在venv安装pip,使用该pip为虚拟环境安装packages且不会对base interpreter的site-packages造成"污染"。实现该目的还有其他替代方法,比如:
1. Install from source,使用venv目录下的python,执行python install setup.py
2. 直接使用base interpreter的pip,指定安装路径为--target=/xx/xx/venv/lib/python3.x/site-packages,按需要决定是否使用参数--no-deps。
关于packages优先级,若在虚拟环境中设置了“inherit global site-packages”,该project会首先使用venv下的package,如果venv目录下没有该package,将会进一步检索base intepreter中的对应的package。
此外,如果我们为project A搭建了虚拟环境,对于新建的project B,若其开发环境与project A是一致的,那么我们并不需要为project B重新建一个虚拟环境,直接使用project A的虚拟环境即可。
图12有一个遗留问题。
懒得写真是一个坏习惯。