一个python项目,会有多个模块,这样既便于开发也利于后期维护。然而有时候我们需要单独对某个模块进行测试,我在其中一个模块导入另一个模块的时候,出现了
ModuleNotFoundError: No module named
明明包的路径并没有问题啊,导入的语句也没错误,怎么就这样了呢?
我要做下说明,该项目使用vscode开发,该问题仅出现在项目中多个自定义模块的相互调用时出现,在使用主程序:setup.py调用则没有报错,而同样的项目在pycharm中则没有出现import不了的情况。
我的直觉就是:import的模块肯定是没有被python搜索到。
要解决这个问题,需要了解下python的搜索路径,默认情况下python会搜索环境变量:path 和PYTHONPATH 这两个变量,当前项目路径必须包含在这两个变量任意一个才可以被搜索到,是不是这个问题呢?看看才知道,我使用python代码,打印了一下这两个变量,得到如下结果:
import sys import os print(f"PATH:{sys.path}") print(f"PYTHONPATH:{os.environ.get('PYTHONPATH')}" )
发现path路径中只包含了该python文件所在目录,PYTHONPATH路径则返回 None
PS E:\xx\ui> python .\ui\ui_proxy.py PATH:['E:\\xx\\ui', 'D:\\Programs\\Python\\Python38\\python38.zip', 'D:\\Programs\\Python\\Python38\\DLLs', 'D:\\Programs\\Python\\Python38\\lib', 'D:\\Programs\\Python\\Python38', 'C:\\Users\\fedke\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32\\lib', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\Pythonwin'] PYTHONPATH:None
项目目录:E:\xx\ 并没有在path和PYTHONPATH路径里,难怪找不到模块,顺便提一句:pycharm已经自动完成了这个步骤,将项目路径添加到了path和PYTHONPATH两个变量中,因此是可以相互调用的。
PATH:['E:\\xx\ui', 'E:\\xx', 'D:\\Programs\\Python\\Python38\\python38.zip', 'D:\\Programs\\Python\\Python38\\DLLs', 'D:\\Programs\\Python\\Python38\\lib', 'D:\\Programs\\Python\\Python38', 'C:\\Users\\fedke\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32\\lib', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\Pythonwin'] PYTHONPATH:C:\xx
知道了问题产生的原因,修复起来也很简单,本文将列出两种方法。
方法一、将项目路径添加到环境变量Path里,在需要调用的模块最顶部添加代码:
# coding=utf-8 import sys import os sys.path.append(os.getcwd())
这个就不会再报错了,程序顺利运行。
然而这种方法也有弊端,需要每次都要添加,比较麻烦,有没有更简单的方法呢?当然是有的,我们来看第二个方法。
方法二、修改vscode配置文件,将项目目录添加到PYTHONPATH中
打开vscode的settings.json文件,添加以下配置:
// 将项目自动添加到PYTHONPATH路径,避免import模块找不到 "terminal.integrated.env.osx": { "PYTHONPATH": "${workspaceFolder}", }, "terminal.integrated.env.linux": { "PYTHONPATH": "${workspaceFolder}", }, "terminal.integrated.env.windows": { "PYTHONPATH": "${workspaceFolder}", },
该配置是临时添加,不会影响系统中设置的环境变量,仅在当前环境中可用,非常方便。
重启下vscode,再次打印path和PYTHONPATH
PATH:['E:\\XX\\ui', 'E:\\XX', 'D:\\Programs\\Python\\Python38\\python38.zip', 'D:\\Programs\\Python\\Python38\\DLLs', 'D:\\Programs\\Python\\Python38\\lib', 'D:\\Programs\\Python\\Python38', 'C:\\Users\\fedke\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32\\lib', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\Pythonwin'] PYTHONPATH:E:\XX
path和PYTHONPATH中都有项目根路径了,没有再报错了,界面出来了:
大功告成,通过文中的方法,现在项目中的模块可以正常import了。