python绝对导入与相对导入(包内导入)(在创建自己的包、模块或系统工程时会用到的知识)

devtools/2024/11/14 2:43:29/

Part 1

我们先上案例,再分析原因。

若在pycharm新建工程,再创立几个文件,文件结构如下图

在这里插入图片描述
也就是说,我们在工程下有文件test.py和文件夹p,在p下分别有run.pytool.py两个文件

一开始,py文件中都为空,现在一步一步来

先在test文件中写入import p.run,然后运行test文件,发现程序正常运行;

我们再在run文件中写入import tool,运行run,发现依然正常。

我们再回到test文件,运行,结果如下:

python">ModuleNotFoundError: No module named 'tool'

系统无法找到tool模块,这是为什么?

因为我们平时运行import时,是没有指明路径的,此时系统会从sys.path中寻找路径,来依次查看每一个路径中是否有我们需要的模块,我们修改test文件如下,并运行

python"># import p.run
import sys
print(sys.path)

结果为:

python">['D:\\code\\pythonProjectTest', 'D:\\code\\pythonProjectTest', 'D:\\Python\\Python39\\Lib\\site-packages', 'D:\\Python\\Python39\\python39.zip', 'D:\\Python\\Python39\\DLLs', 'D:\\Python\\Python39\\lib', 'D:\\Python\\Python39', 'D:\\code\\pythonProjectTest\\venv', 'D:\\code\\pythonProjectTest\\venv\\lib\\site-packages']

我们再来到`run模块,执行如下代码:

python"># import tool
import sys
print(sys.path)

有结果:

python">['D:\\code\\pythonProjectTest\\p', 'D:\\code\\pythonProjectTest', 'D:\\Python\\Python39\\Lib\\site-packages', 'D:\\Python\\Python39\\python39.zip', 'D:\\Python\\Python39\\DLLs', 'D:\\Python\\Python39\\lib', 'D:\\Python\\Python39', 'D:\\code\\pythonProjectTest\\venv', 'D:\\code\\pythonProjectTest\\venv\\lib\\site-packages']

系统检索sys.path的机制和windows中的PATH是类似的,因此不再解释

我们只看sys.path的前2项,其中第一项是当前py文件所属文件夹,第二项是工程文件夹。而一旦执行了某个py文件,sys.path就已经确定了

因此原因就出来了,我们之前执行test文件时,生成的sys.path不会含有'D:\\code\\pythonProjectTest\\p'路径,自然就找不到模块tool

Part 2

我们依然一边运行,一边分析

之前无法在run中导入tool,现在我们把run中代码改为from . import tool,在回到test执行代码,会发现程序正常运行。

原因:我们采用了相对路径而不是绝对路径,.代表所属上一级目录。此外,..代表上上级目录

这里需要额外说明的是,不能像在命令行中把...完全理解为针对目录的操作,因为在python中,上一级和上上级是针对模块名称进行操作的。也许说得有点抽象,我们上代码:在testrun中,分别在第二行加入语句print(__name__),然后在test中执行,有:

python">p.run
__main__

其中run中的语句先打印,这一点大家应该明白。

也就是说,每个模块都有一个__name__属性,若某模块直接以脚本的方式被执行,那么模块名称就是__main__,而若使用模块的方式被加载,模块名就会对应地改变

之后,run模块的模块名称就是p.runp就是它的顶级名称(类似目录),也就是在run中能够访问到的最高级。

比如我们在test同级处新建文件test2,改run中代码为from .. import test2,之后来到test并执行,有结果

python">ImportError: attempted relative import beyond top-level package

即超越了顶级包的位置,不能访问。同理,在脚本文件中也不能使用.的方式来访问属于同一层级的其他模块,因为包名__main__中并没有层级结构

以上适用于py3,py2有所不同,但使用越来越少,不再说明了。


http://www.ppmy.cn/devtools/4046.html

相关文章

Mac idea启动vue项目的时候报Permission denied

问题 node_modules/.bin/vue-cli-service: Permission denied 原因, 权限不足. 解决方案 chmod 777 node_modules/.bin/vue-cli-service 这里的chmod 777 是给启动服务提高权限。 注意赋权路径一定要相同 最后再重新启动命令即可

有关栈的练习

栈练习1 给定一个栈(初始为空,元素类型为整数,且小于等于 109),只有两个操作:入栈和出栈。先给出这些操作,请输出最终栈的栈顶元素。 操作解释: 1 表示将一个数据元素入栈&#xff…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架,在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动&…

【JavaSE】异常

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 认识异常 异常分类 举例 栈溢出错误 空指针异常(运行时异常) 编译时异常 处理异常 抛出 异常 程序本身触发异常 手动抛出异常 举例 利用try ca…

“Python+”集成技术高光谱遥感数据处理与机器学习深度应用

本文涵盖高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论,旨在帮助学员深入理解科学原理。结合Python编程工具,专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&…

【数据挖掘】课程大纲

第1章 数据挖掘基础 1.1 某知名连锁餐饮企业的困惑 1.2 从餐饮服务到数据挖掘 1.3 数据挖掘的基本任务 1.4 数据挖掘建模过程 1.4.1 定义挖掘目标 1.4.2 数据取样 1.4.3 数据探索 1.4.4 数据预处理 1.4.5 挖掘建…

STM32H7定时器TIM1-TIM17中断、PWM实现

STM32H7定时器TIM1-TIM17中断、PWM实现 高级定时器硬件框图定时器模式时基输出PWM定时器输入捕获 TIM1-TIM17的中断配置TIM1-TIM17的PWM输出 STM32H7 支持的定时器有点多,要简单的区分下。STM32H7 支持 TIM1-TIM8,TIM12-TIM17 共14 个定时器,…

【RV1106的ISP使用记录之基础知识】硬件连接关系与设备树的构建

RV1106具备2个mipi csi2 dphy硬件,1个VICAP硬件和1个ISP硬件。其中: 1、mipi csi2 dphy 用于对数据流的解析,支持MIPC,LVDS,DVP三种接口; 2、VICAP用于数据流的捕获; 3、ISP用于对图像数据进行处理; 这三个…