记一次 VSCode - Anaconda - bash 联动配置
前提:
- 已安装Visual Studio Code (VSCode)
- 已安装Anaconda。Anaconda依赖的Python版本为3.7.6。Anaconda已创建三个虚拟环境,env_py2 (python=2),env_py3 (python=3),env_py37 (python=3.7)。env_py3中安装了numpy,现需要使用它在VSCode中编写相关代码。
- 已安装Git-2.25.0-64-bit,提供bash
现在已经配成功了,简单地把配置过程记录一下。
1·理解VSCode设置的用户-工作区-文件夹层级关系
菜单-文件-首选项-设置 可进入设置界面。(请忽略“常用设置”四个大字,这是截图的时候没截好)但是我之前一直没理解其中的覆盖关系。后来才知道“用户”设置优先级低于“工作区”设置,再低于“文件夹”设置。按道理来说还有个“默认”设置低于它们所有。这有点像“作用域”的概念。
这些默认项的含义、名称都可以在官网找到(https://code.visualstudio.com/docs/python/settings-reference)。
2·设置项
翻了翻别人的博客,以及上官网查了一下,以及鬼使神差人肉遍历了一遍“设置-功能-终端”和“设置-扩展-Python”,确实发现了一些疑似需要设置的项,设置如下。原理放在后面解释。(部分路径已省略)
在用户设置中:(settings.json)
{
"terminal.integrated.env.windows": {"python_env":"env_py3"},
"terminal.integrated.shell.windows":"C:\\Windows\\System32\\cmd.exe",
"terminal.integrated.shellArgs.windows": ["/K","activate","env_py3"],
"terminal.integrated.automationShell.windows": "<路径>\\Git\\bin\\bash.exe",
}
在launch.json中:(我的launch.json是放在工作区根目录下的)
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
}
]
}
在工作区设置中:(work_space.json)
{
"folders": [
{
"path": "<路径>\\Python_Workspace"
}
],
"settings": {
"python.pythonPath": "<路径>\\Anaconda3\\envs\\env_py3\\python.exe",
"python.condaPath": "<路径>\\Anaconda3\\Scripts\\",
"python.venvPath": "<路径>\\Anaconda3\\envs\\env_py3",
},
}
同时,在<路径>\Git\etc\.bashrc中添加以下语句:
alias activate=". $(which activate)"
alias deactivate=". $(which deactivate)"
echo $python_env
activate $python_env
3·设置项解释
"terminal.integrated.env.windows": {"python_env":"env_py3"},
对于windows环境下启动的内置终端(integrated terminal),营造字典中的临时变量。这些变量在Git\etc\.bashrc的设置中还会再用到(虽然这个例子中只有一个变量)。
"terminal.integrated.shell.windows":"C:\\Windows\\System32\\cmd.exe",
对于windows环境下启动的内置终端,采用什么可执行文件作为shell的程序?采用cmd.exe。(待会解释“内置终端”和“自动shell”的区别)
"terminal.integrated.shellArgs.windows": ["/K","activate","env_py3"],
对于windows环境下启动的内置终端,给入什么参数?给入["/K",“activate”,“env_py3”]这些参数。据我推测,VSCode启动cmd的方式是在后台输入一行指令,根据上面的设置,我们规定了这行启动指令为"C:\Windows\System32\cmd.exe /K activate env_py3"。待会一并演示效果。
"terminal.integrated.automationShell.windows": "<路径>\\Git\\bin\\bash.exe",
对于windows环境下启动的自动shell,采用什么可执行文件作为shell的程序?采用bash.exe。这是Git自带的。
- 图中1:cmd是“内置终端”,即“terminal.integrated.shell.windows”,而2:Python Debug Console是“自动Shell”,即“terminal.integrated.automationShell.windows”,因此1是cmd,而2是bash(这和后面的设置有关,需要设置调试时启动integratedTeminal)。1是打开VSCode就有的命令行,而2是调试Python才会出现的命令行(调试别的语言也会有)。换句话说,1是给人用的,2是给机器自动化任务用的,两者可以不是同一个程序。
- 然后,有一个最重要的事情:"terminal.integrated.shellArgs.windows"是专门给“内置终端”启动用的参数,“自动Shell”是不使用这些参数的!这也使我一开始绕了很远的弯路。一开始我指望把自动Shell也设成cmd,但它并不会听话地进入env_py3的环境,以至于环境中的包不会被识别,从而触发包调用错误。
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
}
对于python的调试任务,调试时开启integratedTerminal。(这里会定向到自动Shell,因为调试任务属于自动化任务)
"settings": {
"python.pythonPath": "<路径>\\Anaconda3\\envs\\env_py3\\python.exe",
"python.condaPath": "<路径>\\Anaconda3\\Scripts\\",
"python.venvPath": "<路径>\\Anaconda3\\envs\\env_py3",
},
分别设置python解释器的路径、conda的路径、虚拟环境的路径。由于我在这个工作区中默认会使用env_py3这个环境,所以python解释器路径和虚拟环境都调成了对应值。
alias activate=". $(which activate)"
alias deactivate=". $(which deactivate)"
activate $python_env
.bashrc中的这几句意义:两个假名,是因为bash中进入conda虚拟环境的语句是"source activate env_py3",而cmd中是"activate env_py3",退出的也有区别。为了保持一致,用假名做一个替换。不替换也行,下面的语句改一下就可以
"activate $python_env"就是在启动了bash之后自动执行的进入env_py3虚拟环境的语句。python_env正是在"terminal.integrated.env.windows"中给出的那个,它的值是env_py3。
4·其他注意事项
bash.exe不要选成git-bash.exe,我试过,git-bash.exe不能在VSCode中作为内置终端/自动Shell,可能是它不支持stdin/stdout/stderr的重定向。bash.exe就可以。