美文网首页
Pycharm虚拟环境的使用:构建独立的开发环境

Pycharm虚拟环境的使用:构建独立的开发环境

作者: wangww29 | 来源:发表于2019-03-26 18:03 被阅读0次

开发环境: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。

图1 创建虚拟环境,不勾选“inherit global site-packages” 图2 创建虚拟环境,勾选“inherit global sit-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中,从而失去了创建虚拟环境的意义,容易导致兼容性问题。

图3 不勾选“inherit global site-packages”,venv中的bin文件夹包含pip和easy_install,使用该路径下的pip安装packages不会对base interpreter产生影响 图4 勾选“inherit global site-packages”,venv中的bin文件夹不包含pip和easy_install,在该项目的terminal中使用pip安装packages,将会装到base interpreter的site-packages下 图 5 虚拟环境下,在终端中使用pip安装packages 图6 不勾选“inherit global site-packages”,在终端中使用pip安装cltk,该package及依赖安装到venv的目录下 图7 不勾选“inherit global site-packages”,在终端中使用pip安装cltk,不会对base interpreter产生影响 图8 虚拟环境下,在终端中使用pip安装packages,此虚拟环境勾选了“inherit global site-packages” 图9 虚拟环境勾选了“inherit global site-packages”,在项目terminal中使用pip安装snphwe,“”污染“”了base intepreter

        其实我们的需求很简单,即在虚拟环境中能够使用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)

图10 设置了“inherit global site-packages” ,在venv的bin目录中安装pip 图11 设置了“inherit global site-packages” ,在venv的bin目录中安装pip ,对比图4,venv的目录下增加了pip相关的文件,pip安装到了venv中的site-packages下面。

          接下来,我们验证一下,使用该pip安装cltk是否会“污染”base interpreter的site-packages。

图12 设置了“inherit global site-packages” ,使用venv中的pip3.7安装cltk,注意必须使用pip3.7,,否则仍然安装到base interpreter的site-packages。个人认为这里有bug,按理来说使用pip是该路径下的pip,不应该安装到base interpreter的site-packages,推测安装pip时,使用的是python3.7,存在对应关系? 图13  设置了“inherit global site-packages” ,使用venv中的pip3.7,将cltk安装到venv的目录下面 图14 目标达成,使用venv中的pip3.7安装cltk对base interpreter不产生影响

        至此,在虚拟环境中设置了“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。

图15 使用base interpreter的pip指定安装路径到虚拟环境 图16 使用base interpreter的pip指定安装路径到虚拟环境,对base interpreter没有影响

        关于packages优先级,若在虚拟环境中设置了“inherit global site-packages”,该project会首先使用venv下的package,如果venv目录下没有该package,将会进一步检索base intepreter中的对应的package。

图17 优先使用venv目录下packages,venv中含有pandas 0.23.0,base interpreter中安装了pandas 0.23.4,import pandas使用的是venv中的pandas

        此外,如果我们为project A搭建了虚拟环境,对于新建的project B,若其开发环境与project A是一致的,那么我们并不需要为project B重新建一个虚拟环境,直接使用project A的虚拟环境即可。

        图12有一个遗留问题。

图18 使用现有的开发环境 图19 若出现错误please use a different SDK name” ,重命名interpreter

懒得写真是一个坏习惯。

相关文章

网友评论

      本文标题:Pycharm虚拟环境的使用:构建独立的开发环境

      本文链接:https://www.haomeiwen.com/subject/rahgvqtx.html