关于python import时报错:No module named xxx的原因与解决办法
- 问题一
- 原因
- vscode语法提示未报错原因
- 运行报错原因
- 解决办法
- 问题二
- 解决办法
- 参考
问题一
当我们在python中import位于其他文件夹下的对象时,会报错No module named xxx,举例如下。
在Project文件夹下有文件夹FoldA和FoldB,我想在main.py中调用file_b.py文件中的函数。
mian.py:
file_b.py:
vscode语法提示未报错,但运行main.py时报错
原因
vscode语法提示未报错原因
当使用vscode打开一个工程文件夹时,vscode会将工程文件夹作为根目录。此时,不管在工程文件夹下的哪个子文件夹下的py文件中使用"./",都表示的是根目录的所在地址,而不是这个py文件的所在文件夹。
例如:Project文件夹下有图片1.jpg(足球),FoldA文件夹下也有图片1.jpg(杯子),在main中用cv2显示图片1.jpg发现显示的是足球而不是杯子。
而vscode的python语法提示(pylance插件)在寻找依赖的时,从根目录出发寻找是能识别到Project文件夹下的FoldB文件夹,所以没有报错。
运行报错原因
python通过from xxx import xxx导入包时,会在以下范围搜寻指定文件名的文件
- 首先搜索所运行py文件的当前文件夹
- 搜索环境变量PYTHONPATH内的文件路径
- 最后搜索python安装路径内的sitepackages文件夹(一般通过pip安装的包,均会默认放到这个文件夹下)
我们通过print(sys.path)查看搜索的范围
可以看到sys.path中的路径是在FoldA下查找而不是从Project下查找,当然查找不到FoldB文件夹了。
解决办法
- 通过sys.path.apped()方法将Project文件夹加入到sys.path中去。
- 我们在工作区根目录下的.vscode/launch.json文件中将Project文件夹加入到PYTHONPATH中去。
问题二
想要import导入vscode工作区以外的py文件中的对象,举例如下:
以问题一中的FlodA为根目录使用vscode打开,并同样在main.py中调用file_b.py中的函数。
我们同样可以使用问题一中的解决方法:
1.
2.
但这两种方法不会消除vscode的语法警告,看着十分难受。
解决办法
我们在.vscode文件夹中新建settings.json和.env文件。
其中settings.json文件内容如下:
.env文件内容如下:
修改完后重启vscode,可看到语法警告消失,并且程序可正常运行。
参考
- https://www.jianshu.com/p/04701cb81e38
- 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