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,一经查实,立即删除!

相关文章

【杂记-利用TCP协议传输数据始末详解】

一、三次握手前: 1、使用TCP协议的原因 TCP协议的目的是为了保证数据能在两端准确、连续的传输。 2、实现多设备传输的基础 TCP协议可使一个设备能同时与多个设备交互信息,它必须要保证不同传输通道之间不会产生串联或相互影响,所以TCP使用S…

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…

SpringCloud配置文件bootstrap不生效问题解决

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…

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

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

java-求质数问题

在 Java 中求质数是一个经典的问题&#xff0c;它可以很好地展示编程技巧和数学知识。质数是只有两个正因数&#xff1a;1 和它本身的数。例如&#xff0c;2、3、5、7、11、13 等都是质数。在计算机科学中&#xff0c;质数有着广泛的应用&#xff0c;比如在密码学、公共密钥加密…

521源码-免费源码下载-免费学习教程-常见的原生js封装ajax

更多 网站源码 学习教程 游戏源码&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 请看以下案例&#xff1a; function ajax(options) {var xhr null;var type GET;var params formsParams(options.data);if(typeof options.type ! undefined){type o…

【Flutter】KeyAnimatedList组件

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月28日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

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

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

Java 实验12 线程同步与通信

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

202305青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头 小母牛。问第n 年的时候, 共有多少头母牛? 由递推法可推测, 当年数小于等于 4 的时候, 第几年就是有几头牛, 即 a[1]=1; a[2]=2; a[3]=3; a[4]=4。 当 n 大于 …

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

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

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

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

GB/T 18915.2-2013 低辐射镀膜玻璃检测

低辐射镀膜玻璃是指对红外线有较高反射比的镀膜玻璃&#xff0c;根据工艺的不同分为离线镀膜玻璃和在线镀膜玻璃。 GB/T 18915.2-2013低辐射镀膜玻璃测试项目&#xff1a; 测试项目 测试方法 尺寸 GB/T 18915.2 弯曲度 GB/T 18915.2 外观质量 GB/T 18915.2 光学性能 …

如何从 JavaScript 对象中移除属性?

在 JavaScript 中,移除对象中的属性是一项常见的操作。本文将详细介绍如何使用 delete 操作符以及其他相关方法。 使用 delete 操作符 delete 操作符用于从对象中移除属性。例如: const obj = {foo: "bar" };delete obj.foo; console.log(obj.hasOwnProperty(&q…

大模型微调系列 --关于`transformer`中的`pipeline`是什么

大模型微调系列 --关于transformer中的pipeline是什么 pipeline就是一个帮你做数据预处理以及一些模型加载&#xff0c;模型预测的步骤的工具&#xff0c;提供各种接口 定义数据预处理函数 对输入的文本进行预处理 转换为小写去除标点符号去除特殊字符 def preprocess_tex…

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…

Java中集合中对象的某一个属性转为set集合

在Java中&#xff0c;如果你想要将一个集合&#xff08;比如List<YourObject>&#xff09;中对象的某个属性&#xff08;假设为String类型&#xff09;提取出来并放入一个Set<String>集合中&#xff0c;以确保去重&#xff0c;你可以通过Java 8的Stream API来轻松地…

Codeforces Round 946 (Div. 3)

Codeforces Round 946 &#xff08;div3&#xff09; A. Phone Desktop题意&#xff1a;题解&#xff1a;代码&#xff1a; Symmetric Encoding题意&#xff1a;题解&#xff1a;代码&#xff1a; C. Beautiful Triple Pairs题意&#xff1a;题解&#xff1a;代码&#xff1a;…

洛谷 CF1209D Cow and Snacks

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