python自定义的模块导入项目中的其他模块出现ModuleNotFoundError: No module named 错误的处理办法

一个python项目,会有多个模块,这样既便于开发也利于后期维护。然而有时候我们需要单独对某个模块进行测试,我在其中一个模块导入另一个模块的时候,出现了

ModuleNotFoundError: No module named

明明包的路径并没有问题啊,导入的语句也没错误,怎么就这样了呢?

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中都有项目根路径了,没有再报错了,界面出来了:

python自定义的模块导入项目中的其他模块出现ModuleNotFoundError: No module named 错误的处理办法

大功告成,通过文中的方法,现在项目中的模块可以正常import了。

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

qq
微信
微信
分享本页
返回顶部