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

【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中,当你导入一个模块时,解释器会按照特定的顺序搜索模块所在的目录。这些目录包括:

  1. 当前工作目录:Python首先搜索运行脚本的当前工作目录。

  2. PYTHONPATH环境变量:如果设置了PYTHONPATH环境变量,Python会按照其中指定的目录顺序搜索模块。

  3. Python安装目录:Python安装时会设置一个默认的标准库目录,模块搜索也会在这个目录中进行。

  4. 第三方库目录:如果你使用了第三方库,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委员会效果图 经营简报效果图不需要合并单元格且有汇总表头的 懒得封装了&#xff0c;所以整体没有封装 经营简报 效果图 代码 <template><el-tableref"tableRef":data"tableData.lengt…...

Spring Security 构建基于 JWT 的登录认证

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

PyTorch从零开始实现Transformer

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

运动蓝牙耳机什么牌子的好用、最好用的运动蓝牙耳机推荐

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

HTTP、HTTPS协议详解

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

【算法与数据结构】222、LeetCode完全二叉树的节点个数

文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析&#xff1a;利用层序遍历&#xff0c;然后用num记录节点数量。其他的例如…...

登录和注册表单的11个HTML最佳实践

原文&#xff1a;11 HTML best practices for login & sign-up forms 原作者&#xff1a;Andrey Sitnik 翻译已获原文作者许可&#xff0c;禁止转载和商用 大多数网站都有登录或注册表单;它们是业务转换的关键部分。然而&#xff0c;即使是流行的站点也没有实现本文中提到的…...

Mysql删除历史数据

Mysql定时删除历史数据 实现 1.创建存储过程&#xff08;函数&#xff09; 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—数据结构(一)

先放一张自己学习和整理归纳的思维导图&#xff0c;以便让大家都知道我自己的整体学习路线。 数据结构的学习路上内容枯燥&#xff0c;但坚持下来一定有很大的收获&#xff01;加油&#x1f4aa;&#x1f3fb;&#xff01; 数据结构 数据的概念数据元素&#xff1a; 若干基本…...

离线环境安装flask依赖包

找到当前版本需要的所有依赖包&#xff0c;生产flask项目生成项目依赖包文件requirements.txt 1)在当前项目目录下 生成requirements文件&#xff1a;pip freeze >requirements.txt 执行requirements文件&#xff0c;安装依赖包&#xff1a;pip install -r requirements.t…...

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址&#xff1a;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 中的文件在物理上是分块存储 &#xff08;Block &#xff09; &#xff0c; 块的大小可以通过配置参数( dfs.blocksize&#xff09;来规定&#xff0c;默认大小在Hadoop2.x/3.x版本中是128M&#xff0c;1.x版本中是64M。 如果一个文件文件小于128M&#xff0c;该文件会占…...

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…...

无涯教程-jQuery - wrapInner( html )方法函数

wrapInner(html)方法使用HTML结构包装每个匹配元素(包括文本节点)的内部子内容。 wrapInner( html ) - 语法 selector.wrapInner( html ) 这是此方法使用的所有参数的描述- html - 将动态创建并环绕目标的HTML字符串。 wrapInner( html ) - 示例 以下是一个简单的示例…...

【unity之IMGUI实践】单例模式管理数据存储【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...