python中import的搜索路径

news2024/10/6 12:29:37

文章目录

      • 前言
    • 一 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 pprint

pprint.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 test2

pprint.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.coloradmin.cn/o/1704896.html

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

相关文章

Brewer Science将在CS Mantech进行展示

在风景如画的亚利桑那州图森市举办的CS Mantech盛会上(2024年5月20日至23日),杰出化合物半导体材料企业Brewer Science,将带来一场名为“化合物半导体制造的创新材料解决方案”的演讲盛宴。这一演讲,定于五月二十一日星…

今日好料推荐(数据资产+数字化案例)

今日好料推荐(数据资产数字化案例) 参考资料在文末获取,关注我,获取优质资源。 数字化的介绍 数字化(Digitization)是指将模拟信息转换为数字格式的过程。这一过程包括将文字、图像、音频、视频等信息转…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…

SwiftUI中TabView(PageTabViewStyle的用法及无限滚动组件infinity carousel)

上一篇文章主要介绍了TabView的基本用法以及一些外观样式的设置&#xff0c;本篇文章主要介绍一下PageTabViewStyle样式下的TabView&#xff0c;该样式下的TabView允许用户整页滑动界面&#xff0c;在UIKit中我们用UIScrollView和UICollectionView制作滚动组件&#xff0c;本文…

C++进阶 | [4] map and set

摘要&#xff1a;set&#xff0c;multiset&#xff0c;map&#xff0c;multimap 前言 1. 容器 序列式容器&#xff1a;只存储数据&#xff0c;数据之间无关联关系。例如&#xff0c;vector、list、deque、……关联式容器&#xff1a;不仅存储数据&#xff0c;且数据之间有关联…

Chrome谷歌浏览器如何打开不安全页面的禁止权限?

目录 一、背景二、如何打开不安全页面被禁止的权限&#xff1f;2.1 第一步&#xff0c;添加信任站点2.2 第二步&#xff0c;打开不安全页面的权限2.3 结果展示 一、背景 在开发过程中&#xff0c;由于测试环境没有配置 HTTPS 请求&#xff0c;所以谷歌浏览器的地址栏会有这样一…

《Python侦探手册:用正则表达式破译文本密码》

在这个信息爆炸的时代&#xff0c;每个人都需要一本侦探手册。阿佑今天将带你深入Python的正则表达式世界&#xff0c;教你如何像侦探一样&#xff0c;用代码破解文本中的每一个谜题。从基础的字符匹配到复杂的数据清洗&#xff0c;每一个技巧都足以让你在文本处理的领域中成为…

代码随想录——最大二叉树(Leetcode654)

题目链接 递归 二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode rig…

Django Celery技术详解

文章目录 简介安装和配置创建并调度任务启动Celery Worker在视图中调用异步任务拓展功能 简介 Django Celery 是一个为Django应用程序提供异步任务处理能力的强大工具。它通过与消息代理&#xff08;如RabbitMQ、Redis&#xff09;集成&#xff0c;可以轻松地处理需要长时间运…

[C#]winform部署官方yolov10目标检测的onnx模型

【框架地址】 https://github.com/THU-MIG/yolov10 【算法介绍】 今天为大家介绍的是 YOLOv10&#xff0c;这是由清华大学研究团队最新提出的&#xff0c;同样遵循 YOLO 系列设计原则&#xff0c;致力于打造实时端到端的高性能目标检测器。 方法 创新 双标签分配策略 众所…

shell脚本-函数

一、函数 1.函数的定义和格式 函数定义&#xff1a;封装的可重复利用的具有特定功能的代码 先定义函数&#xff0c;再调用函数&#xff0c;注意顺序 函数类似于命令的别名&#xff0c;别名一些简单的小命令 函数是某一个脚本的别名&#xff0c;有些脚本会重复使用 函数格…

【链表】Leetcode 92. 反转链表 II【中等】

反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#x…

【一刷《剑指Offer》】面试题 24:二叉搜索树的后序遍历系列

力扣对应题目链接&#xff1a;LCR 152. 验证二叉搜索树的后序遍历序列 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;二叉搜索树的后序遍历序列_牛客题霸_牛客网 (nowcoder.com) 核心考点 &#xff1a; BST 特征的理解。 一、《剑指Offer》对应内容 二…

NASA数据集——严格校准的臭氧(O3)、甲醛(HCHO)、二氧化碳(CO2)和甲烷(CH4)混合比,以及包括三维风在内的气象数据

Alpha Jet Atmopsheric eXperiment Meteorological Measurement System (MMS) Data 阿尔法喷气式大气实验气象测量系统&#xff08;MMS&#xff09;数据 简介 Alpha Jet Atmospheric eXperiment (AJAX) 是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&a…

LAMP网络服务架构

目录 LAMP 网站服务架构 LAMP的组成部分 LAMP的构建顺序 安装论坛 0.电脑已编译安装Apache&#xff0c;MySQL&#xff0c;PHP 1.创建数据库&#xff0c;并进行授权 2.上传论坛压缩包到 /opt ,并解压 3.上传站点更新包 4.更改论坛目录的属主 5.浏览器访问验证 LAMP 网…

2024年03月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行如下代码,若输入整数3,则最终输出的结果为?( ) def f(x):if x==1:s=1else:s

各种情况下的线缆大小选择

开口线鼻子和导线对应大小 开口铜鼻子对应线径大小 变压器容量对应高压侧电流大小 开关电流线缆功率对照表 家庭/工业最常用电线铜线电流承载功率 电工常用名词对应符号 导线面积承载的安全载流量及允许负荷对照表 漏电保护器选择参考表 电动机功率换算电流 电机功…

应用程序中的会话管理和Cookie安全指南

应用程序中的会话管理和Cookie安全指南 在现代应用程序中&#xff0c;会话管理和Cookie安全是确保用户信息和数据安全的重要组成部分。本文将详细介绍会话管理的最佳实践以及如何通过安全的Cookie设置来保护会话ID的交换。 单点登录&#xff08;SSO&#xff09;及会话管理机制…

其二:使用递归法实现二分搜索

开篇 本文主要是利用递归法来实现一个简单的二分搜索程序。题目来源是《编程珠玑》第4章课后习题3。 问题概要 编写并验证一个递归的二分搜索程序, 并返回t在数组x[0…n-1]中第一次出现的位置。 思路分析 本题的思路与第一版相似&#xff0c;不过不同的是&#xff0c;为确保返回…

Android 通过布局生成图片

通过布局生成图片 首先效果图 在竖屏的情况下通过&#xff0c;一般情况下&#xff0c;只要布局在页面上可见&#xff0c;并显示全&#xff0c;通过布局生成图片&#xff0c;都可以&#xff0c;但是横屏就不行了&#xff0c;会出现图片显示不完全的情况。 val bitmap Bitmap.c…