python中import的搜索路径

文章目录

      • 前言
    • 一 python中import的搜索路径
      • 1. python中import的搜索路径
        • 先判断是否内置模块
        • 根据sys.path查找
        • 1.1 脚本当前目录和所属项目目录
        • 1.2 环境变量
        • 1.3 标准库
        • 1.4 .pth 文件
        • 1.5 第三方库
      • 2. 解决ModuleNotFoundError

前言

  码python时经常会遇到找不到包或者找不到模块的报错,为了以后少出现这类问题,今天来学习记录下python中import的搜索路径。

一 python中import的搜索路径

  在码python时我们会因为各种各样的原因遇到ModuleNotFoundError: No module named ‘XXX’ 的报错,这个报错通常是在引用某个包或者模块时报的,是python中新手老手都会遇到的问题。像我这种不是python专业开发但是平时又要用的人来说,遇到此类问题有时候就得花点时间,索性今天来探探其中的缘由。

1. python中import的搜索路径

  通过查看python官方手册和网上大佬的博文得知import的搜索路径有两大步骤:先判断import后面的XXX包是不是内置的,内置的基本不会报错,可以直接使用。如果XXX不是内置的,那么就从sys.path的列表中依次查找XXX,如果遍历完sys.path还找不到XXX就抛No module named XXX异常结束。其中sys.path对于我们来说才是重点,因为我们平时自建的包不是python内置的,其搜索路径一般加在sys.path中的。具体如下

先判断是否内置模块

  使用import导入XXX会先判断XXX是否是python内置模块,是内置模块的基本都不会报错,除非XXX名字与内置模块命名重复冲突。

根据sys.path查找
1.1 脚本当前目录和所属项目目录

  当XXX不是内置模块时,python解释器就会依次遍历sys.path列表中的路径寻找XXX,注意这里是依次遍历,是有先后顺序的
  来看看sys.path列表中都有哪些信息

import sys
import pprintpprint.pprint(sys.path)

结果如下
在这里插入图片描述
上面是在window环境用pycharm打印的sys.path。最前面的两个是分别是:当前远行脚本所在的目录当前脚本所属的项目所在的目录,但要注意这里的当前脚本所属的项目所在的目录有可能是编辑器自动添加到sys.path的。比如我这里的’D:\python\python-learning’, 就是pycharm自动给添加的,如下
在这里插入图片描述
但如果你去cmd命令行打印sys.path,就不会自动给你添加项目目录,如下
在这里插入图片描述
在这里插入图片描述
可以看到在cmd命令行打印的sys.path里面只有当前脚本所在目录,没有脚本所在的项目目录。所以很多时候我们在编辑器里面运行好好的,但在命令行运行却报No module named XXX异常,就是因为这个原因。

例如我在pycharm和cmd运行CSDN.py,在pycharm运行不会报错,而cmd运行则会报错,如下
CSDN.py

import sys
import pprint
from 模块和包 import test2pprint.pprint(sys.path)
print("分割线".center(50, '#'))
test2.test_2()

在这里插入图片描述
在这里插入图片描述

1.2 环境变量

  如果模块在脚本当前目录和所属项目目录都没有找到的话就会通过环境变量去查找。
   比如我在E盘E:\python-path有个demo.py,如果我不加环境变量PYTHONPATH,那么其它目录下的脚本import demo就会抛异常。而加了环境变量PYTHONPATH,sys.path列表就会自动添加PYTHONPATH的路径,从而不会报错。如下
  未加环境变量PYTHONPATH,报错
在这里插入图片描述
  添加加环境变量PYTHONPATH,sys.path增加PYTHONPATH的路径,不会抛异常。这里要注意添加PYTHONPATH后要重启pycharm
在这里插入图片描述
在这里插入图片描述

1.3 标准库

  如果模块通过环境变量没有找到,那么会去python的标准库目录中查找。
在这里插入图片描述

1.4 .pth 文件

  如果模块在标准库没有被找到,那么会通过.pth文件中的路径继续查找模块。.pth文件的作用和环境变量PYTHONPATH一样,都会把路径加到sys.path.pth文件要放在python安装目录下的site-package文件下,一行就代表一个路径
比如我通过.pth来添加E:\python-pth,import 该目录的test.py模块,如下
在这里插入图片描述在这里插入图片描述
test.py

def test():print("this is .pth")

运行结果如下
在这里插入图片描述
可以看到sys.path列表中已经添加了E:\python-pth目录,而且成功import 其目录下的test模块。

1.5 第三方库

  如果.pth文件里面的目录也找不到模块,那么就会去第三方库目录site-packages查找,如果第三方库还找不到就抛ModuleNotFoundError异常。

2. 解决ModuleNotFoundError

  上面学习记录了import的时候python是怎么查找模块或者包的,现在来看看当遇到ModuleNotFoundError时该怎么解决,详情请看: 解决python import时ModuleNotFoundError异常(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenWrt 23.05 安装之后默认空间小 磁盘扩容 教程 软路由实测 系列六

1 安装fdisk opkg update opkg install fdisk #查看磁盘 rootOpenWrt:~# fdisk -l GPT PMBR size mismatch (246303 ! 250069679) will be corrected by write. The backup GPT table is not on the end of the device. Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 25006…

开源远程协助:分享屏幕,隔空协助!

🖥️ 星控远程协助系统 🖱️ 一个使用Java GUI技术实现的远程控制软件,你现在就可以远程查看和控制你的伙伴的桌面,接受星星的指引吧! 支持系统:Windows / Mac / Linux 🌟 功能导览 &#x1f…

【Flutter】KeyAnimatedList组件

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月28日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

10个最佳人物素材网站推荐,免费获取第一个PNG文件!

人物素材是设计中应用最广泛的元素之一。无论是网页设计还是移动终端设计,人物素材的插画设计都比文字信息更容易吸引用户的注意力。作为内容呈现,还可以增加设计的艺术属性。为了节省大家寻找人物素材的时间成本,本文立即为大家整理了10个宝…

Java 实验12 线程同步与通信

(一)实验目的 1、掌握JAVA中多线程的实现方法; 2、重点掌握多线程的同步与通信机制; 3、熟悉JAVA中有关多线程同步与通信的方法 ; 4、能使用多线程机制解决实际应用中的线程同步与通信问题。 (二&…

行为设计模式之职责链模式

文章目录 概述原理代码实现小结 概述 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止. 在职责链模式中&…

宝塔:如何在宝塔面板做301重定向

如何在宝塔面板做301重定向?301重定向对于网站来说非常重要。如果你的网站以www开头,我们应该把没有www的域名重定向到有www的域名,反之亦然。 1、我们进入宝塔管理后台 2、登录面板并单击添加站点。既然要把xxx.com 301发到www.xxx.com,我…

JS 中怎么删除数组元素?有哪几种方法?

正文开始之前推荐一位宝藏博主免费分享的学习教程,学起来! 编号学习链接1Cesium: 保姆级教程+源码示例2openlayers: 保姆级教程+源码示例3Leaflet: 保姆级教程+源码示例4MapboxGL: 保姆级教程+源码示例splice() JavaScript中的splice()方法是一个内置的数组对象函数, 用于…

05.配置tomcat管理功能

认证失败&#xff0c;需要配置tomcat-users.xml文件 配置用户信息 [rootweb01 /application/tomcat/conf\]# tail tomcat-users.xml <role rolename"admin-gui"/> <role rolename"host-gui"/><role rolename"mana…

洛谷 CF1209D Cow and Snacks

题目来源于&#xff1a;洛谷 题目本质&#xff1a;并查集 解题思路&#xff1a; 我们以每种化为一个点&#xff0c;以每个客人喜欢的两朵花给两朵花连一条无向边。则会出现一定数目的连通块&#xff0c;连通块总个数为 ans。 对每个连通块进行分析&#xff1a;第一个客人买走…

QGraphicsView实现简易地图17『涟漪效果』

前文链接&#xff1a;QGraphicsView实现简易地图16『爆炸效果』 模仿水波荡漾时的涟漪效果&#xff0c;参考了echarts中的散点图 支持设置散点大小、颜色、涟漪线条宽度。 动态演示效果 静态展示图片 核心代码 #pragma once #include "../AbstractGeoItem.h" #incl…

452. 用最少数量的箭引爆气球(中等)

452. 用最少数量的箭引爆气球 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;452. 用最少数量的箭引爆气球 2.详细题解 引爆所有气球&#xff0c;弓箭数要最少&#xff0c;那么每支弓箭尽量多的引爆气球&#xff0c;采用贪心策略。对于…

ThingsBoard网关在燃气泄漏监测中的应用

据不完全统计&#xff0c;全国城市燃气企业的供销差率大约在3%~4%&#xff0c;也就意味着越多的天然气销量就有越多的天然气损失。城市燃气企业计量管理已经接近最不利的状态&#xff0c;开展有效的计量管理势在必行。 智慧燃气综合管理系统 在燃气管网中部署智能传感器、数据采…

AI分析SP和pk进行sk分析

SP原始表行标题代表题目序号&#xff0c;列代表学生&#xff0c;如果学生答对题目为1&#xff0c;否则为0。问题知识点矩阵这个文件横轴代表每个知识点&#xff0c;列标题代表每个题目序号&#xff0c;如果题目包含这个知识点则该处值为1。通过两个文件判断学生对于每个知识点的…

Web安全:文件上传漏洞详解,文件上传漏洞原理、绕过方式和防御方案。

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

Java实现链表

链表 前言一、链表的概念及结构二、链表的分类三、链表的实现无头单向非循环链表实现无头双向链表实现具体代码 四、链表习题五、顺序表和链表的区别 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我…

51单片机-实机演示(单多个数码管)

仿真链接&#xff1a; http://t.csdnimg.cn/QAPhx 目录 一.引脚位置 二.多个显示 三 扩展 一.引脚位置 注意P00 - >A ; 这个多个的在左边,右边的A到B是控制最右边那个单个的. 接下来上显示单个的代码 #include <reg52.h> #include <intrins.h> #define u…

大字体学生出勤记录系统网页HTML源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…

用源码建站可能涉及知产侵权,建站的注意!

近日普推知产老杨看到央视报道一家公司用了某建站源码涉及知产侵权&#xff0c;起诉了全国八千多家公司&#xff0c;某梦自从创始人因病转给某公司后&#xff0c;也在大量起诉用其建站代码公司侵权&#xff0c;他们也都是申请了相关的著作权。 有的中小企业在运营中会涉及建站…

c++ 将指针转换为 void* 后,转换为怎么判断原指针类型?

当将指针转换为void后&#xff0c;擦除了指针所指向对象的类型信息&#xff0c;因此无法通过void指针来判断原始指针的类型。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个…