当前位置: 首页 > article >正文

Vscode运行Python无法导入自己编写的包的解决方法

前言

在Vscode编辑器中,我经常用于编写Python代码,这一过程中,无论是导入第三方包还是Python内置的包,都未曾遇到过任何问题。然而,当我尝试导入一个跨文件自定义的包时,却遭遇了导入异常的问题。这一经历促使我撰写本文,希望通过分享解决这一问题的方法,帮助遇到类似问题的开发者。以及我觉得“包”这个称呼,不太贴切我们日常使用操作系统的习惯,因此后面我都会称呼为“文件夹”

作者所使用的平台

  • Vscode编辑器

  • python3.8.10

  • venv虚拟环境

存在的问题

导入模块时,可以看到编辑器并没有给出任何的报错
在这里插入图片描述

但是运行cluster.py的时候,出现了下面的错误

Traceback (most recent call last):
  File "d:\z资料\s数学建模\MathModels\Models\cluster.py", line 6, in <module>
    from DataProcess.decomposer import PCA
ModuleNotFoundError: No module named 'DataProcess'

通过查看文件树,可以看到DataProcess 是一个文件夹,cluster.py所在的文件夹ModelsDataProcess文件夹是属于同级文件夹
在这里插入图片描述

这里有个知识点,是你必须知道的,Python在导入包的时候,会对包所在的路径进行搜索,并且这个搜索是有优先级的

  1. 当前目录:Python首先检查当前的工作目录。
  2. PYTHONPATH:这是环境变量,包含了一系列目录路径,Python会在此查找。
  3. 安装的第三方库:Python会检查在site-packages目录下的第三方库。
  4. Python标准库:最后,Python会检查内置的标准库。

这个顺序确保了本地目录的优先级最高,然后是用户自定义的路径,接着是第三方库,最后是Python的标准库。这样做可以避免本地目录下的模块与标准库或第三方库中的模块发生命名冲突。

从上面的优先级可以看到,我们之所以会出现ModuleNotFoundError: No module named 'DataProcess',是因为我们导入的包的位置不符合上述四个当中的任意一个,因此Python解释器在解释代码的时候就无法找到我们自定义的包。

解决的方法

根据上述讲到的问题,我们简单分析一下,既然Python解释器无法找到我们自定义的包,那么就由我们自己告诉Python解释器,我们自定义的包在什么地方不就行了?😈😈这里可以使用.pth文件来手动指定Python搜索包的路径

在Python中,.pth文件是一种文本文件,它包含了一行一行的目录路径。这些路径会被Python解释器识别,并将其添加到模块搜索路径中。通过使用.pth文件,我们可以轻松地自定义Python模块的路径,方便地添加第三方库或自己编写的模块。所以.pth文件就提供给了我们除了上面四种搜索方法的额外拓展的办法。

  1. 找到site-packages文件夹

这个文件夹一般是用来存放第三方库的位置,我们可以利用这个文件夹,他通常都会在python解释器的Lib目录下,比如本文用的是venv虚拟环境,这个文件夹都位于.venv\Lib\site-packages

  1. 在site-packages文件夹下新建一个mypath.pth文件

这个文件名是任取的,不一定非得叫mypath

  1. 在mypath.pth文件写入自定义包的路径

拿我自己的项目举例,你只需要在mypath.pth文件中填写项目根目录文件夹的路径就行了,如下图所示

ps:这里推荐用绝对路径,当然用相对路径也是可以的
在这里插入图片描述

在这里有一个非常容易出现的误区,有些人可能会心想,既然导入的是DataProcess包(文件夹),那么为什么不直接填写DataProcess包(文件夹)的路径呢(如下图所示)?事实上,这种想法是错误的,在路径搜索中python解释器会将一个包(文件夹)当成一个整体看待,因此你给出的路径得是这个包的根目录才行。
在这里插入图片描述

运行结果

一切都顺利的话,我们再次重新运行cluster.py,应该就不会再次出现导入出错的情况了
在这里插入图片描述

如何你执行完以上的步骤后,仍然会导入异常,可能有以下的原因

  • 缓存没有清空
  • .pth文件放错位置了
  • 路径没有写对

可以尝试清空缓存试试,按下ctrl+shift+p,输入python,找到下面的选项
在这里插入图片描述


http://www.kler.cn/a/308606.html

相关文章:

  • sol机器人pump机器人如何实现盈利的?什么是Pump 扫链机器人?
  • 今日 AI 简报 | 开源 RAG 文本分块库、AI代理自动化软件开发框架、多模态统一生成框架、在线图像背景移除等
  • 响应式网页设计--html
  • vue2+ element ui 集成pdfjs-dist
  • K8资源之endpoint资源EP资源
  • 知识库管理系统:企业数字化转型的加速器
  • 后端开发刷题 | 最长上升子序列
  • odoo14 | 报错:Database backup error: Access Denied
  • MyBatis之手动映射
  • SSL认证解说
  • 个人随想-gpt-o1大模型中推理链的一个落地实现
  • Linux学习记录十四----------线程的创建和回收
  • Leetcode—1184. 公交站间的距离【简单】
  • Linux(CentOS8)服务器安装RabbitMQ
  • Python数据分析工具(一):Requests的用法
  • 游戏中的唯一id生成,防止合服id重复
  • 成功激活mac idea 记录
  • Java封装(面向对象)
  • 104.WEB渗透测试-信息收集-FOFA语法(4)
  • 腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口
  • [go] 命令模式
  • 电信创维光猫DT741超级密码
  • 【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)
  • 文件标识符fd
  • 嵌入式Linux学习笔记(5)-进程间常见通讯方式(c语言实现)
  • 09_Python流程控制_分支