python的包内绝对导入,相对导入以及环境变量路径问题

article/2025/8/25 14:16:48

学python的过程中遇到的模块导入问题造成了我很长时间的困顿,最近再重温一下模块的导入和包内模块导入,发现了一些新东西,所谓温故知新,确实如此,特来记录。

1. 模块的导入和环境变量

首先要清楚一点的是,Python的环境变量是解释器寻找文件模块的依据,环境变量第一条路径一般就是当前运行文件所在的路径,例如下面这个例子,我执行的文件是dao2.py,在test文件夹下,通过sys.path也能显示出来。

在这里插入图片描述

print(sys.path)

在这里插入图片描述

输入的环境变量列表第一条确实是当前运行文件目录\test文件夹。所以我们导包也应该尽量将包和模块放到与运行文件同一目录下,直接import导入即可,包和模块都可以通过环境变量找到。

如果是将包或模块放到了其他位置,那么通过sys.path.append()添加模块所在的目录到环境变量,也可以找到。

2. 包内模块导入

包内的导入涉及到__init__.py文件,相对导入以及绝对导入。

在文件夹中加入__init__.py文件之后,这个文件夹就变成了包,可以直接导入包来当做模块,具体知识点不再赘述,主要说说其中绝对导入和相对导入的问题。

问题1: 包内导入中经常碰到类似 ModuleNotFoundError: No module named ‘main.xxx’; ‘main’ is not a package这样的问题,发生这种问题的原因,一般是将包内的模块按照脚本模式去运行,但是在执行文件中使用了相对导入.xxx的形式,执行文件所在的目录就是环境变量的第一条路径,所以解决方法是直接使用import导入模块名或者用from xxx import绝对导入的方式,推荐用绝对导入,这时通过环境变量就可以找到要导入的模块名。举例如下:

在这里插入图片描述

# test1.py
from .test2 import hello
import sysprint(sys.path)
hello(3)

当前执行文件是test1.py,是haha包下的模块,按照脚本模式运行,不能用相对导入的形式 从test2.py中导入hello使用,test1和test2都在haha文件夹下,这里却使用了相对导入.test2的形式,那么结果就出现ModuleNotFoundError: No module named ‘main.xxx’; ‘main’ is not a package这样的问题。
在这里插入图片描述
问题2:还有一个问题就是一些博客说出现了ModuleNotFoundError: No module named ‘main.xxx’; ‘main’ is not a package这个问题可以使用绝对导入的形式解决:

# test1.py
from haha.test2 import hello
import sysprint(sys.path)
hello(3)

但是又会出现模块找不到的问题:
在这里插入图片描述
我想可能是一些博主改变了运行文件的路径才能成功,如果模块和执行文件还在一个目录下,那么加入了haha这个顶级包名,出现找不到haha的情况,问题依旧出在环境变量上。因为导入的haha这个顶级包名和环境变量中的路径重复,导致有问题,如果把包含haha这个目录的上一级目录test加到环境变量中,那么这个就不会出错了,例如下面这样:

sys.path.append(test_path)
# test1.py
from haha.test2 import hello
print(sys.path)
hello(3)

使用sys.path.append将这个test路径临时加到环境变量列表末尾。
像这样,将haha所在的文件夹test加入到环境变量里,就能够找到haha这个包了,正常输出。
在这里插入图片描述
在这里插入图片描述
或者把haha.test2改为test.haha.test2,因为环境变量包含test的上级目录,但是不包含haha的上级目录test,前面的方法是把haha的上级目录加到环境变量里面。

因此如果当前执行文件是test1.py,在haha目录下,test2.py模块也在haha目录下, 直接导入模块名即可。

# test1.py
from test2 import hello
import sysprint(sys.path)
hello(3)

用绝对导入时注意环境变量的路径问题。

在这里插入图片描述
问题3:到底什么时候使用绝对导入和相对导入,就是只能在包内进行模块的绝对导入和相对导入,如果要执行包内的模块脚本,不能用相对导入方式,应该用绝对导入或者直接导入同目录下的模块名,否则还是出现上面的问题。而且在包内使用 from aa.bb.cc.dd import ee 这种形式的导入,必须确保.的左边都是文件夹,可以是包,也可以是普通的文件目录。总之,包是当作模块来用,只需把包和要导入的模块放到和执行脚本相同的目录下正常导入就会减少出错。
总结: 其实问题的关键还是两点:
一是明确环境变量,清楚当前执行文件是在哪一个文件夹下,那么这个目录就是环境变量的第一个路径,解释器优先从这条路径找模块和代码。
二是当在包内或文件夹内运行可执行脚本文件时,注意导入模块的方式,脚本模式运行文件,文件内导入模块不能用相对导入,要用绝对导入或者直接导入同目录下的模块名,只要在环境变量的路径列表就行。


http://chatgpt.dhexx.cn/article/kspL7RE5.shtml

相关文章

Python import无法导入包问题

一个文件夹下的同一级的文件,import 时却无法导入,怪哉?! This inspection detects names that should resolve but dont. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are suppor…

python中包的导入

包的导入 包的概念包的使用问题 包结构与__init__.py文件 from XXX import * 绝对导入与相对导入 包内部的相互导入/python解释器眼中的顶级包 —:包的概念 可以简单的理解为包就是一个包含着__init__.py文件的文件夹,里面包含着多个文件&#xff0…

python导入栈包

项目场景: 最近刚刚学完了python以及爬虫,数据可视化等几个专题的练习,接受老师建议开始学习python结构数据预算,结果第一章一个栈就差点把我送走。 问题描述: 利用栈实现进制转换出现报错。 from pythonds.basic.s…

python导入Wordcloud包

这个问题弄了我两天时间,找了好多帖子,都没导入成功,还是大佬帮忙,一下子就解决了,归根结底是我太菜了,含泪记下之前的错误方式及步骤,便于以后查找 一、settings直接导入 pycharm中settings小…

关于Python包导入报错的总结

首先,一般来说,写一个小demo可能一个文件就够了,但是要是做一个小项目,可能需要拆分成很多零散的文件,放在不同的文件夹里面调用,这个就称之为模块(包),Python的导包是一件令人头疼的事情,当文件多了之后,同样的导入方式可能在不同的场合遇到解释器抛出异常 错误记录: 1. Mod…

python导入自定义包时无法导入自己定义的包

python导入自定义包时 显示找不到包,如下图 处理方法如下: 点击文件夹选择工作目录 点击后就可以正常导包啦

python 导入自定义的包

有时候我们需要在程序中导入额外的python包,这个时候就需要用到这里的知识.这里介绍两种导包方式. 一. 手动导包 其工作的原理就是将搜索路径加入python的sys.path 数组中. python工作的时候会自动搜索sys.path 中所有的目录,那么我们 可以自定义一个目录,然后在目录中建立一…

VSCode python 导入包之后显示下划黄线

在 VSCode 中编写 python 脚本,在 import 包的时候显示下划黄线,如下所示: 通过 pip show 命令查询可知 serial 和 tqdm 已经成功安装,路经如下所示: 则在设置里面搜索 python.analysis.extraPaths,手动输…

python导入包如果找不到

说明系统中可能没有前缀,可以在sys.path中加入各类查找路径,这样编译的时候会进行这些前缀的检索,如果是当前目录的,则不用加,直接Import那个包即可。

python如何导入包

包(模块)的命名规范: 为什么需要遵循命名规范?如果包的命名不遵循命名规范 ,那么在导入包时即使方法是正确的,也无法有效的导入该包 1.命名有字母、数字和下划线三个组成 2.项目名、包名、模块名、pytho…

【查看Python导入包的地址】

查看Python中import的包的绝对地址: 【效果】: 【代码】: #将package_name换成需要查找的包 import package_name print(package_name.__file__)

python怎么导入包-python如何导入包

本文主要讲解python导入包的几种方法 一、模块的导入方式 模块就是.py类型的Python文件 导入时不需要.py后缀,直接导入文件名即可 利用import直接导入: 语法:import module_name 使用方式:module_name.class_name或者module.func_name 利用import导入模块并设置一个…

Python导包的几种方法,自定义包的生成以及导入详解

Python是一门灵活的语言,也可以说Python是一门胶水语言,顾名思义,就是其可以导入各类的包,python的包可以说是所有语言中最多的。当然导入包大部分是为了更快捷,更方便,效率更高。对于刚入门的python爱好者来说最初接触的应该是import直接导入包的方式,例如 import time…

Python开发之Python导包的几种方法,自定义包的生成以及导入详解

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。 下面介绍python的几种…

Openstack云平台脚本部署之Ceph存储集群配置(十四)

目录 一、简介 二、部署脚本 三、参考文档 四、源码 五、系列文章 一、简介 Openstack的后端存储对接Ceph分布式统一存储,将Glance镜像、Nova虚拟机及快照、Cinder-Volume的存储在Ceph统一存储上。Ceph在Openstack社区的带动下发展迅速,已经成为最受…

ceph分布式存储搭建

目录 一、环境搭建 1.基础环境 2.centos1安装软件 3.创建集群 4.修改配置文件 5.安装软件 二、构建集群 1.初始化monitor 2.同步管理信息 3.安装mgr 4.安装rgw 5.创建mds服务 三、安装OSD 1.centos1、centos2、centos3、三个虚拟机各加一个磁盘 2.热刷新磁盘并格…

Ceph存储搭建及在k8s中的使用

一、基础环境准备 主机IP主机名部署服务备注192.168.0.91admin-nodeceph、ceph-deploy、monmon节点又称为master节点192.168.0.92ceph01cephosd192.168.0.93ceph02cephosd Ceph版本 10.2.11 Ceph-deploy版本 7.6.1810 内核版本 3.10.0-957.el7.x86_64 每个节点关闭防火墙和s…

ceph存储应用--owncloud

目录 框架​ 节点规划 部署环境准备 ceph集群部署 在master1上创建集群 创建mon监控组件 监控节点master1初始化 创建mgr管理组件 创建osd磁盘 添加其他节点到ceph集群中 对象存储搭建 创建对象存储网关 创建owncloud应用 ceph对象存储对接owncloud 安装s3工具 框…

ceph存放mysql备份_Kubernetes持久化Ceph存储

一、依然简介 Kubernetes使用Persistent Volume和Persistent Volume Claim两种API资源来管理存储。 PersistentVolume(简称PV):由管理员设置的存储,它是集群的一部分。就像节点(Node)是集群中的资源一样,PV也是集群中的资源。它包含存储类型,…

关于 Ceph 存储集群配置的一些笔记

写在前面 Ceph 考试整理笔记,老师总结基础上,略有补充博文内容涉及: ceph 集群的配置简单介绍永久和零时修改集群配置文件集群 Mon 的配置集群身份验证的配置集群多网络的配置 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有…