记一次 VSCode - Anaconda - bash 联动配置

记一次 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就可以。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值