目录

  • 前言
  • 一、问题现象
  • 二、原因分析
  • 1.关于vscode
  • 2.关于python
  • 解决方法
  • 尚未解决的疑问


前言

遇到一个很离谱的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错误

pytorch vscode pytorch VScode Python_pytorch vscode


但是使用命令行却可以运行

pytorch vscode pytorch VScode Python_Power_02

二、原因分析

1.关于vscode

初次启动时,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指令来激活环境

pytorch vscode pytorch VScode Python_环境变量_03


如果没有将conda所在路径加入环境变量(实际上,在安装时也不推荐这么做),也可以通过conda init powershell来解决(其原理在于给powershell创建一个预加载的profile来达到目的)

但是,重点在于,如此这般也仅能解决一半的问题,如果不使用终端运行程序(例如:调试控制台,或者code-runner不在终端运行时),仍然会出现ImportError,甚至在未提前打开调试终端的前提下,运行调试的代码有时候也会先于conda activate执行,从而导致错误发生

2.关于python

先上一段引自带佬网友的内容

Python导入包或模块分为三种情况

  1. 当前执行脚本(主动执行,而不是被其他模块调用)所在路径
  2. python内置的标准库路径,PYTHONPATH
  3. 安装的第三方模块路径

按照这个思路可以验证,在pytorch_env环境下和在外部,只要指定的是同一个解释器,那么他们的import路径并无不同,因此可以确定,问题并不在此

解决方法

折腾了半天,解决却非常简单,只要跟随指示,在pytorch_env环境下update一下numpy包就可以了

conda update numpy

尚未解决的疑问

目前一通分析下来,还有一个没有解决:
为何,在外部环境直接使用解释器import会出错,但在环境内部使用解释器没有问题,难道他们使用的numpy包不是同一个?