关于python import时报错:No module named xxx的原因与解决办法

  • 问题一
  • 原因
  • vscode语法提示未报错原因
  • 运行报错原因
  • 解决办法
  • 问题二
  • 解决办法
  • 参考


问题一

当我们在python中import位于其他文件夹下的对象时,会报错No module named xxx,举例如下。

vscode python main函數沒有啓動箭頭 vscode python no module named_搜索


在Project文件夹下有文件夹FoldA和FoldB,我想在main.py中调用file_b.py文件中的函数。

mian.py:

vscode python main函數沒有啓動箭頭 vscode python no module named_python_02


file_b.py:

vscode python main函數沒有啓動箭頭 vscode python no module named_vscode_03


vscode语法提示未报错,但运行main.py时报错

vscode python main函數沒有啓動箭頭 vscode python no module named_根目录_04

原因

vscode语法提示未报错原因

当使用vscode打开一个工程文件夹时,vscode会将工程文件夹作为根目录。此时,不管在工程文件夹下的哪个子文件夹下的py文件中使用"./",都表示的是根目录的所在地址,而不是这个py文件的所在文件夹。

例如:Project文件夹下有图片1.jpg(足球),FoldA文件夹下也有图片1.jpg(杯子),在main中用cv2显示图片1.jpg发现显示的是足球而不是杯子。

vscode python main函數沒有啓動箭頭 vscode python no module named_vscode_05


而vscode的python语法提示(pylance插件)在寻找依赖的时,从根目录出发寻找是能识别到Project文件夹下的FoldB文件夹,所以没有报错。

运行报错原因

python通过from xxx import xxx导入包时,会在以下范围搜寻指定文件名的文件

  • 首先搜索所运行py文件的当前文件夹
  • 搜索环境变量PYTHONPATH内的文件路径
  • 最后搜索python安装路径内的sitepackages文件夹(一般通过pip安装的包,均会默认放到这个文件夹下)

我们通过print(sys.path)查看搜索的范围

vscode python main函數沒有啓動箭頭 vscode python no module named_开发语言_06


可以看到sys.path中的路径是在FoldA下查找而不是从Project下查找,当然查找不到FoldB文件夹了。

解决办法

  1. 通过sys.path.apped()方法将Project文件夹加入到sys.path中去。
  2. vscode python main函數沒有啓動箭頭 vscode python no module named_python_07

  3. 我们在工作区根目录下的.vscode/launch.json文件中将Project文件夹加入到PYTHONPATH中去。
  4. vscode python main函數沒有啓動箭頭 vscode python no module named_搜索_08

问题二

想要import导入vscode工作区以外的py文件中的对象,举例如下:

以问题一中的FlodA为根目录使用vscode打开,并同样在main.py中调用file_b.py中的函数。

我们同样可以使用问题一中的解决方法:

1.

vscode python main函數沒有啓動箭頭 vscode python no module named_python_09


2.

vscode python main函數沒有啓動箭頭 vscode python no module named_开发语言_10


但这两种方法不会消除vscode的语法警告,看着十分难受。

解决办法

我们在.vscode文件夹中新建settings.json和.env文件。

其中settings.json文件内容如下:

vscode python main函數沒有啓動箭頭 vscode python no module named_根目录_11


.env文件内容如下:

vscode python main函數沒有啓動箭頭 vscode python no module named_python_12

修改完后重启vscode,可看到语法警告消失,并且程序可正常运行。

vscode python main函數沒有啓動箭頭 vscode python no module named_vscode_13

参考


  1. https://www.jianshu.com/p/04701cb81e38

  2. https://zhuanlan.zhihu.com/p/107514340#:~:text=%E5%B0%86%E9%A1%B9%E7%9B%AE%E7%9B%AE%E5%BD%95,%E7%94%9F%E6%95%88%E7%9A%84%E6%96%B9%E5%BC%8F%E3%80%82