学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 这种形式的导入,必须确保.的左边都是文件夹,可以是包,也可以是普通的文件目录。总之,包是当作模块来用,只需把包和要导入的模块放到和执行脚本相同的目录下正常导入就会减少出错。
总结: 其实问题的关键还是两点:
一是明确环境变量,清楚当前执行文件是在哪一个文件夹下,那么这个目录就是环境变量的第一个路径,解释器优先从这条路径找模块和代码。
二是当在包内或文件夹内运行可执行脚本文件时,注意导入模块的方式,脚本模式运行文件,文件内导入模块不能用相对导入,要用绝对导入或者直接导入同目录下的模块名,只要在环境变量的路径列表就行。

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

  1. python os.environ.setdefault_django os.environ慎用setdefault操作环境变量

    在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...

  2. python详细安装教程 path-Python解释器安装教程以及环境变量配置

    Python解释器安装 1.打开Python官网 www.python.org 2. 鼠标放在 Downloads 上,并选择相对应的系统 3.寻找你想要的版本,以3.7.3版本为例 3.1 64位系 ...

  3. python os.environ.set_django os.environ慎用setdefault操作环境变量

    在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...

  4. python 导包 numpy_导入Python包时出错(例如Numpy)

    我正在使用一个计算群集,无法访问整个群集.因此,我尝试在本地(在我的"home"目录中)安装python的包,但是从脚本导入它们时遇到了问题.在 我试图更新我的路径和PYTHONP ...

  5. 内网安装python第三方包_内网安装python第三方包

    内网快速安装python第三方包 内网安装包是一个很麻烦的问题,很多时候,内网的源会出现问题,导致无法安装. 这里给出一种快速在内网中安装第三方包,无需使用内网的源. 外网操作 1.根据开发环境下的所 ...

  6. python的包文件叫什么_python之包和文件目录规范

    一.什么是包 包就是一个包含有__init__.py文件的文件夹 二.为何要有包 包的本质是模块的模块的一种形式,包是用来被当做模块导入 1.产生一个名称空间 2.运行包下的__init__.py文件 ...

  7. python的包package

    目录 pip是啥?pip和pip3的区别是啥? 模块与包的区别: __init__.py文件的主要作用是: __pycache__文件夹的作用 今日无聊,想看看pip是啥? 众所周知,用python时 ...

  8. window安装python3装环境变量_Windows下的Python安装与环境变量的配置

    Windows下的Python安装与环境变量的配置 第一步:python下载: 第二步:python安装: 双击下载包,进入Python安装向导. 此处省略安装时的配图,下一步.下一步即可.但请要注意 ...

  9. Python安装与环境变量的配置

    Python安装与环境变量的配置 python下载: Python安装包下载地址 1 . 选择Windows系统的 2 . 选择相应的32/64位版本点击下载 python安装: 1 . 下载完成后, ...

最新文章

  1. python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
  2. IntelliJ IDEA for Mac 如何设置 tab 键为 4 个空格?
  3. 数据结构课程设计 迷宫问题
  4. java碰到乱码如何解决方法_如何处理java的乱码
  5. 产品设计体会(6010)有关网站改版
  6. java 清屏函数_c++清屏函数是什么
  7. 服务器imm装系统,通过IMM With Remote Console为服务器安装操作系统
  8. oracle分析函数详解
  9. c语言大地坐标转空间直角坐标,大地坐标转换直角坐标的C++代码(高斯克吕格投影)...
  10. matlab 批量读取nc 三维,matlab读取nc文件画图
  11. ISO18000-6B和ISO18000-6C(EPC C1G2)标准的区别
  12. qca9533 openwrt 启动信息
  13. pic32用PICKIT3烧写bootloader
  14. 该怎么回答面试官问“你有什么优缺点?”
  15. 海康威视py和c++调用全(超精髓,亲测)
  16. Integer和int详解
  17. 全球互联网排名_全球互联网的梦想已死
  18. 阿里云 Redis 报出You can't read against a non-read redis.解决方案
  19. ant-modal的弹窗拉伸
  20. Linux之(6)Kconfig基础知识

热门文章

  1. 考研高数考纲增加内容(无穷区间-无界函数 反常积分比较判别法_比较判别法的极限形式)(无穷级数积分判别法)
  2. HashMap, HashSet, HashMap Iterator
  3. opencv中的SGBM原理+参数解释
  4. ecshop {insert name='comments' type=$type id=$id} 什么意思
  5. iDNA-ABF:DNA甲基化可解释预测的多尺度深度生物语言学习模型
  6. mysql时间戳转换Oracle
  7. java mysql时间戳_mysql肿么将java时间戳转换
  8. 熊猫学猿--熊猫自述
  9. 血栓到底是怎么形成的
  10. mac下载python打不开_“Mac应用”已损坏,打不开解决办法