遇到一个很离谱的bug,记录一下,先上环境:
项 | 版本 |
---|---|
Pytorch | 1.8.1 |
Cuda | 11.1 |
Anaconda | 4.9.2 |
Python | 3.8.8 |
vscode | 1.55.0 (system setup) |
OS | Win10家庭版 20H2 |
一个简单的pytorch测试代码
import torch
print(torch.__version__)
print(torch.cuda.is_available())
使用conda配置了一个pytorch_env的环境
使用vscode调试时import torch出现ImportError错误
但是使用命令行却可以运行
初次启动时,vscode会引导用户选择python的解释器,并在setting中添加这么一条:
"python.pythonPath": "<解释器路径>"
这条json指定了解释器的路径,debug时会使用这条路径下的解释器
并且,vscode在打开终端时,会默认执行
conda activate pytorch_env
来激活conda的虚拟环境,因为,vscode中python插件的activateEnvironment属性默认为true
"python.terminal.activateEnvironment": true
可惜的是,vscode这么做是完全没有作用的,pytorch_env这个环境并不能如此被激活,其原因在于Win10客户端Power shell的执行策略默认为限制
执行策略的状态可以通过Power shell执行如下指令查看
Get-ExecutionPolicy
通过将执行策略更改为RemoteSigned,Power shell便能够执行外部的脚本
Set-ExecutionPolicy RemoteSigned
这时候,如果已经将conda所在路径加入环境变量,那么就能够通过conda activate指令来激活环境
如果没有将conda所在路径加入环境变量(实际上,在安装时也不推荐这么做),也可以通过conda init powershell来解决(其原理在于给powershell创建一个预加载的profile来达到目的)
但是,重点在于,如此这般也仅能解决一半的问题,如果不使用终端运行程序(例如:调试控制台,或者code-runner不在终端运行时),仍然会出现ImportError,甚至在未提前打开调试终端的前提下,运行调试的代码有时候也会先于conda activate执行,从而导致错误发生
先上一段引自带佬网友的内容
Python导入包或模块分为三种情况
- 当前执行脚本(主动执行,而不是被其他模块调用)所在路径
- python内置的标准库路径,PYTHONPATH
- 安装的第三方模块路径
按照这个思路可以验证,在pytorch_env环境下和在外部,只要指定的是同一个解释器,那么他们的import路径并无不同,因此可以确定,问题并不在此
折腾了半天,解决却非常简单,只要跟随指示,在pytorch_env环境下update一下numpy包就可以了
conda update numpy
目前一通分析下来,还有一个没有解决:
为何,在外部环境直接使用解释器import会出错,但在环境内部使用解释器没有问题,难道他们使用的numpy包不是同一个?