【python】No module named xxx

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

问题一

当我们在python中import位于其他文件夹下的对象时,会报错No module named xxx,举例如下。
工程文件夹
在Project文件夹下有文件夹FoldA和FoldB,我想在main.py中调用file_b.py文件中的函数。
mian.py:
main
file_b.py:
file_b
vscode语法提示未报错,但运行main.py时报错
在这里插入图片描述

原因

vscode语法提示未报错原因

当使用vscode打开一个工程文件夹时,vscode会将工程文件夹作为根目录。此时,不管在工程文件夹下的哪个子文件夹下的py文件中使用"./",都表示的是根目录的所在地址,而不是这个py文件的所在文件夹。
例如:Project文件夹下有图片1.jpg(足球),FoldA文件夹下也有图片1.jpg(杯子),在main中用cv2显示图片1.jpg发现显示的是足球而不是杯子。
vscode加载
而vscode的python语法提示(pylance插件)在寻找依赖的时,从根目录出发寻找是能识别到Project文件夹下的FoldB文件夹,所以没有报错。

运行报错原因

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

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

我们通过print(sys.path)查看搜索的范围
sys.path
可以看到sys.path中的路径是在FoldA下查找而不是从Project下查找,当然查找不到FoldB文件夹了。

解决办法

  1. 通过sys.path.apped()方法将Project文件夹加入到sys.path中去。
    sys.path.apped

  2. 我们在工作区根目录下的.vscode/launch.json文件中将Project文件夹加入到PYTHONPATH中去。
    launch

问题二

想要import导入vscode工作区以外的py文件中的对象,举例如下:
以问题一中的FlodA为根目录使用vscode打开,并同样在main.py中调用file_b.py中的函数。
我们同样可以使用问题一中的解决方法:
1.
在这里插入图片描述
2.
在这里插入图片描述
但这两种方法不会消除vscode的语法警告,看着十分难受。

解决办法

我们在.vscode文件夹中新建settings.json和.env文件。
其中settings.json文件内容如下:
在这里插入图片描述
.env文件内容如下:
在这里插入图片描述修改完后重启vscode,可看到语法警告消失,并且程序可正常运行。
在这里插入图片描述

参考

  1. https://blog.csdn.net/yifengchaoran/article/details/113576056
  2. https://www.jianshu.com/p/04701cb81e38
  3. https://blog.csdn.net/weixin_39982017/article/details/110681183
  4. 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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值