PyCharm/IntelliJ IDEA已经内置了对virtualenv的支持,当我们为一个项目创建一个新的Python SDK时,就会进入到Add Python Interpreter对话框,选择Virtualenv Environment -> New environment就将创建一套新的virtualenv环境。这里,我们要留心的是PyCharm/IntelliJ IDEA在新建虚拟环境时给出的两项配置的默认值:

  • Location:这是虚拟环境的存放目录,如果用户不显式配置,则默认值是:%USERPROFILE%\.virtualenvs\<项目名称>
  • Base interpreter:当前操作系统上的默认Python环境(等同于使用virtualenv命令行创建虚拟环境时不显式提供-p参数,此时使用的也是当前操作系统上的默认Python环境)

virtualenv mac安装不同python_打通

当然,我们完全可以调整这些默认值,例如:将Location改到项目目录下,使用.venv文件夹,或者是选择本地安装的其他版本的Python系统环境作为Base interpreter, 这两个配置项和使用virtualenv命令行创建虚拟环境时所要填入的dest以及-p参数是完全对等的:

virtualenv mac安装不同python_intellij-idea_02

接下来,我们要考虑的是:在本地启用了virtualenvwrapper的情况下,如何将virtualenvwrapper创建的虚拟环境和PyCharm/IntelliJ IDEA创建的虚拟环境对齐,也就是保持一致的视图。这件事要分两个方向看:

1. 在PyCharm/IntelliJ IDEA上使用virtualenvwrapper创建的虚拟环境

这个非常简单,只要在PyCharm/IntelliJ IDEA的Virtualenv Environment配置环节选择Existing environment,然后给出目标虚拟环境中的python.exe路径即可

2. 在virtualenvwrapper中使用PyCharm/IntelliJ IDEA

其实这个问题也很简单,我们知道,virtualenvwrapper会将所有的虚拟环境集中放置在一个目录下,这个目录由一个环境变量控制,即:WORKON_HOME,如果当前操作系统没有显式配置这个变量的话,则它的默认值在Linux上是$HOME/.virtualenvs,而对于virtualenvwrapper来说,只要是在WORKON_HOME下的子目录,都会被视作一个独立的虚拟环境(经过测试表明,即使只是创建一个空的文件夹,在使用workon命令罗列虚拟环境时,新键的空文件夹也会出现在虚拟环境列表中),这样的话,其实解决思路就很简单了:只要将PyCharm/IntelliJ IDEA创建虚拟环境集时使用的默认根目录%USERPROFILE%\.virtualenvs和virtualenvwrapper的WORKON_HOME目录配置为同一目录,就可以在virtualenvwrapper中自动发现PyCharm/IntelliJ IDEA创建的虚拟环境了。

从PyCharm/IntelliJ IDEA对于默认虚拟环境存放路径的选择上就可以看出:PyCharm/IntelliJ IDEA就是在主动和virtualenvwrapper进行对接,因为它的同样使用了用户根目录,并且根目录的默认名称取名为.virtualenvs也绝对不是偶然,就是为了和virtualenvwrapper无缝对接!实际上,在Linux系统上,virtualenvwrapper和PyCharm/IntelliJ IDEA的虚拟环境根目录已经自动对齐了,都是:$HOME/.virtualenvs,并不需要做其他额外的动作,但是在Windows系统上,我们发现在不显式配置WORKON_HOME环境变量的情况下,virtualenvwrapper的脚本中使用的默认目录是%USERPROFILE%\Envs

virtualenv mac安装不同python_虚拟环境_03

实际验证也是如此。所以在Windows上,打通virtualenvwrapper和PyCharm/IntelliJ IDEA的虚拟环境需要做一项工作:显式地配置WORKON_HOME环境变量,使其指向%USERPROFILE%\.virtualenvs,如下图所示:

virtualenv mac安装不同python_虚拟环境_04


注意,理论上这个变量是用户级别的环境变量,因为考虑到不同用户会构建自己的虚拟环境,需要用户与用户之前进行隔离。如果配置成系统环境变量也是可以的,此时不要使用Hard Code的用户路径,而应使用%USERPROFILE%\.virtualenvs!