【100天精通python】Day16:python 模块的搜索目录和导入模块异常时的处理方法
目录
1 搜索模块所在目录
2 模块不在搜索目录中
2.1 添加模块所在的目录到PYTHONPATH环境变量
2.2 修改sys.path
2.3 使用绝对路径导入
2.4将模块复制到Python搜索路径中的任意一个目录
2.5 总结
3 其他导入的模块异常处理
3.1 模块未安装
3.2 模块名称拼写错误
3.3模块文件缺失
3.4 模块路径问题
1 搜索模块所在目录
在Python中,当你导入一个模块时,解释器会按照特定的顺序搜索模块所在的目录。这些目录包括:
当前工作目录:Python首先搜索运行脚本的当前工作目录。
PYTHONPATH环境变量:如果设置了PYTHONPATH环境变量,Python会按照其中指定的目录顺序搜索模块。
Python安装目录:Python安装时会设置一个默认的标准库目录,模块搜索也会在这个目录中进行。
第三方库目录:如果你使用了第三方库,Python会在第三方库的安装目录中搜索模块。
搜索顺序是从前往后依次进行,一旦找到匹配的模块,搜索就会停止。
如果没有找到指定的模块,Python将引发ModuleNotFoundError
异常。
可以通过以下代码查看Python的模块搜索路径:
import sysprint(sys.path)
上述代码会输出一个包含搜索路径的列表,第一个元素是当前工作目录,之后是PYTHONPATH环境变量中指定的目录,然后是Python安装目录和第三方库目录。
如下:
2 模块不在搜索目录中
如果要导入的模块不在搜索目录中,往往会出现如下错误:
这种情况,没有安装第三方模块包,使用 pip install numpy 安装即可。
另外对于自定义模块。如
在这种情况下,你可以采取以下几种方法来解决问题:
2.1 添加模块所在的目录到PYTHONPATH环境变量
将模块所在的目录添加到PYTHONPATH环境变量中,可以让Python解释器在指定的目录中搜索模块。
在Windows系统中,可以通过以下命令将目录添加到PYTHONPATH环境变量,在bash中输入:
set PYTHONPATH=%PYTHONPATH%;/path/to/module_directory
在Linux和macOS系统中,可以通过以下命令将目录添加到PYTHONPATH环境变量:
export PYTHONPATH=$PYTHONPATH:/path/to/module_directory
这样做可以使Python解释器在启动时自动搜索指定目录中的模块。
2.2 修改sys.path
在Python脚本中使用sys.path.append()
方法将模块所在的目录添加到搜索路径中。
import sys
sys.path.append('/path/to/module_directory')
如果知道模块的绝对路径,也可以使用sys.path.append()
将绝对路径添加到Python搜索路径中,然后通过import
语句导入模块。这样做同样可以解决模块不在搜索路径中的问题。
假设我们有一个自定义的模块文件mymodule.py
,位于/path/to/module_directory
目录下,并且我们知道它的绝对路径是/path/to/module_directory/mymodule.py
。现在我们想在另一个脚本中导入这个模块,但是/path/to/module_directory
不在Python的搜索路径中。
我们可以使用sys.path.append()
将/path/to/module_directory
添加到搜索路径,然后通过import
语句导入模块:
import sys# 添加模块所在目录到搜索路径中
sys.path.append('/path/to/module_directory')# 现在可以导入模块
import mymodule# 使用导入的模块中的函数或变量
mymodule.my_function()
通过这种方法,Python解释器会在指定的绝对路径中搜索模块,并成功导入
mymodule
模块,从而可以使用其中的函数或变量。这样可以临时将特定目录添加到搜索路径中,使得导入模块变得更加灵活。但请注意,这种修改是在运行时有效,当脚本结束后,搜索路径会恢复原样。
2.3 使用绝对路径导入
在Python中,可以使用绝对路径导入模块。这种方法适用于模块文件的位置在任何目录中,不仅限于Python的搜索路径中。
假设我们有一个自定义的模块文件mymodule.py
,位于/path/to/module_directory
目录下,并且我们知道它的绝对路径是/path/to/module_directory/mymodule.py
。现在我们想在另一个脚本中导入这个模块。
(1)可以使用imp
模块来实现绝对路径导入模块:
import imp# 指定模块文件的绝对路径
module_path = '/path/to/module_directory/mymodule.py'# 使用imp.load_source()函数导入模块
mymodule = imp.load_source('mymodule', module_path)# 使用导入的模块中的函数或变量
mymodule.my_function()
通过imp.load_source()
函数,我们可以根据指定的绝对路径导入模块。此方法不依赖于Python的搜索路径,因此可以导入任意位置的模块文件。
需要注意的是,imp
模块在Python 3.4及以上版本中已被标记为过时(deprecated),并建议使用importlib
模块代替。
(2)在较新的Python版本中,可以使用importlib.util.spec_from_file_location()
和importlib.util.module_from_spec()
函数来实现绝对路径导入模块:
import importlib.util# 指定模块文件的绝对路径
module_path = '/path/to/module_directory/mymodule.py'# 使用importlib.util.spec_from_file_location()创建模块规范
spec = importlib.util.spec_from_file_location('mymodule', module_path)# 使用importlib.util.module_from_spec()加载模块
mymodule = importlib.util.module_from_spec(spec)# 将模块规范绑定到模块
spec.loader.exec_module(mymodule)# 使用导入的模块中的函数或变量
mymodule.my_function()
使用
importlib
模块提供了更加灵活和功能强大的方法来导入模块,特别是在Python 3.4及以上版本中。
2.4 将模块复制到Python搜索路径中的任意一个目录
将模块复制到Python标准库目录、第三方库目录或当前工作目录中的任意一个,这样Python解释器就能找到该模块了。
不过这种方法不太推荐,因为直接修改Python的标准库目录或第三方库目录可能会导致不可预料的问题,而且复制模块可能会导致代码不易维护。
2.5 总结
注意:以上方法建议使用第一种方法或第二种方法,即将模块所在的目录添加到PYTHONPATH或sys.path中,这样可以保证在任意位置都能正确导入模块。直接修改Python的标准库目录或第三方库目录可能会导致不可预料的问题,并且不推荐这样做。
3 其他模块导入的异常处理
当在导入模块时遇到找不到相关模块的错误,通常有几个常见的原因和解决方法:
3.1 模块未安装
如果你想导入一个第三方模块,但尚未在你的Python环境中安装该模块,导致找不到模块的错误。解决方法是使用包管理工具(如pip)安装该模块。例如,使用以下命令安装requests
模块:
pip install requests
3.2 模块名称拼写错误
检查你导入模块时的名称是否正确拼写。Python对模块名称是大小写敏感的。
不同Python版本:如果你在不同版本的Python环境中工作,可能会导致某些模块只在特定版本中可用。确保你在正确的Python环境中运行代码。
3.3 模块文件缺失
检查模块文件是否存在,并确保其正确放置在模块搜索路径下。模块文件必须以.py
为扩展名。
3.4 模块路径问题
如果你编写的自定义模块或第三方模块并不在Python解释器的搜索路径中,也会导致找不到模块的错误。解决方法见上文2.1,2.2,2.3,2.4。
如果你仍然遇到找不到模块的错误,请细致检查以上原因,并根据具体情况采取相应的解决方法。
相关文章:

【100天精通python】Day16:python 模块的搜索目录和导入模块异常时的处理方法
目录 1 搜索模块所在目录 2 模块不在搜索目录中 2.1 添加模块所在的目录到PYTHONPATH环境变量 2.2 修改sys.path 2.3 使用绝对路径导入 2.4将模块复制到Python搜索路径中的任意一个目录 2.5 总结 3 其他导入的模块异常处理 3.1 模块未安装 3.2 模块名称拼写错误 3.3模…...

SOC FPGA介绍及开发设计流程
目录 一、SoC FPGA简介 二、SoC FPGA开发流程 2.1 硬件开发 2.2 软件开发 一、SoC FPGA简介 SOC FPGA是在FPGA架构中集成了基于ARM的硬核处理器系统(HPS),包括处理器、外设和存储器控制器。相较于传统的仅有ARM处理器或 FPGA 的嵌入式芯片,SOC FPGA既…...
MySQL vs. Oracle: 函数比较与联系
引言 MySQL和Oracle是两个广泛使用的关系型数据库管理系统(RDBMS),它们提供了丰富的函数库来处理和操作数据。本文将详细介绍MySQL和Oracle的所有函数,并逐一介绍它们的相同和不同之处,以帮助读者更好地理解和使用这两…...

【Django学习】(十五)API接口文档平台_项目流程分析_日志器_认证_授权
一、API接口文档平台 使用API接口文档不经可以很好的的维护接口数据,还给测试人员的接口测试工作带来了便利; 我们可以在全局配置文件中添加路由路径生成接口文档 1、使用docs接口文档维护接口 1.1在全局配置文件里指定用于支持coreapi的Schema # 指…...

经营简报及考核360表格
文章目录 经营简报效果图代码tableObjectSpanMethod.js 考核360委员会效果图 经营简报效果图不需要合并单元格且有汇总表头的 懒得封装了,所以整体没有封装 经营简报 效果图 代码 <template><el-tableref"tableRef":data"tableData.lengt…...

Spring Security 构建基于 JWT 的登录认证
一言以蔽之,JWT 可以携带非敏感信息,并具有不可篡改性。可以通过验证是否被篡改,以及读取信息内容,完成网络认证的三个问题:“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全,使用它需要采用 …...

PyTorch从零开始实现Transformer
文章目录 自注意力Transformer块编码器解码器块解码器整个Transformer参考来源全部代码(可直接运行) 自注意力 计算公式 代码实现 class SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, self).__init__()self.e…...

运动蓝牙耳机什么牌子的好用、最好用的运动蓝牙耳机推荐
音乐是运动的灵魂,而一款优秀的运动耳机则是让音乐与我们的身体完美融合的关键。今天,我推荐五款备受运动爱好者喜爱的耳机,它们以卓越的音质、舒适的佩戴和出色的稳定性能脱颖而出,助你在运动中创造最佳状态。 1、NANK南卡Runne…...

HTTP、HTTPS协议详解
文章目录 HTTP是什么报文结构请求头部响应头部 工作原理用户点击一个URL链接后,浏览器和web服务器会执行什么http的版本持久连接和非持久连接无状态与有状态Cookie和Sessionhttp方法:get和post的区别 状态码 HTTPS是什么ssl如何搞到证书nginx中的部署 加…...

【算法与数据结构】222、LeetCode完全二叉树的节点个数
文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析:利用层序遍历,然后用num记录节点数量。其他的例如…...
登录和注册表单的11个HTML最佳实践
原文:11 HTML best practices for login & sign-up forms 原作者:Andrey Sitnik 翻译已获原文作者许可,禁止转载和商用 大多数网站都有登录或注册表单;它们是业务转换的关键部分。然而,即使是流行的站点也没有实现本文中提到的…...
Mysql删除历史数据
Mysql定时删除历史数据 实现 1.创建存储过程(函数) SQL DROP PROCEDURE IF EXISTS KeepDatasWith30Days CREATE PROCEDURE KeepDatasWith30Days() BEGINSELECT maxId:max(Id) FROM tableName WHERE CreateTime<DATE(DATE_SUB(NOW(),INTERVAL 31 D…...

Python—数据结构(一)
先放一张自己学习和整理归纳的思维导图,以便让大家都知道我自己的整体学习路线。 数据结构的学习路上内容枯燥,但坚持下来一定有很大的收获!加油💪🏻! 数据结构 数据的概念数据元素: 若干基本…...
离线环境安装flask依赖包
找到当前版本需要的所有依赖包,生产flask项目生成项目依赖包文件requirements.txt 1)在当前项目目录下 生成requirements文件:pip freeze >requirements.txt 执行requirements文件,安装依赖包:pip install -r requirements.t…...

ChatGPT与Claude对比分析
一 简介 1、ChatGPT: 访问地址:https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…...

登录和注册页面 - 验证码功能的实现
目录 1. 生成验证码 2. 将本地验证码发布成 URL 3. 后端返回验证码的 URL 给前端 4. 前端将用户输入的验证码传给后端 5. 后端验证验证码 1. 生成验证码 使用hutool 工具生成验证码. 1.1 添加 hutool 验证码依赖 <!-- 验证码 --> <dependency><groupId…...

HDFS的文件块大小(重点)
HDFS 中的文件在物理上是分块存储 (Block ) , 块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。 如果一个文件文件小于128M,该文件会占…...

深度学习(二)
目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值…...
无涯教程-jQuery - wrapInner( html )方法函数
wrapInner(html)方法使用HTML结构包装每个匹配元素(包括文本节点)的内部子内容。 wrapInner( html ) - 语法 selector.wrapInner( html ) 这是此方法使用的所有参数的描述- html - 将动态创建并环绕目标的HTML字符串。 wrapInner( html ) - 示例 以下是一个简单的示例…...

【unity之IMGUI实践】单例模式管理数据存储【二】
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...