学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. golang sqlite数据库 rows.Close()造成 错误database is locked
  2. **52.常用的存储保护方法有哪些?
  3. boost::hana::remove用法的测试程序
  4. springboot 通过@Value读取自定义属性文件变量获取结果为null
  5. WPF中radiobutton 的 data binding方法
  6. hibernate(二)annotation第一个示例
  7. 图像基础ImageMagick图像处理
  8. 数据结构与算法之并查集
  9. python界面登录程序_python的基础程序——简陋的管理员(用户)登录界面
  10. 城市按首字母分类,各城市对应的县和区
  11. VGA驱动实现并下板EGO1
  12. 计算机语言英语作文80词,春节英语作文80字【带中文翻译】-太平洋电脑网
  13. 空间句法软件sDNA安装教程及加载到ArcGIS方法
  14. 使用webpack-cli或vue-cli 解决ie兼容性与报错问题
  15. python数据拟合固定参数_固定某些参数的双峰高斯分布拟合
  16. 例程1. LKB -- 慕司板IAP15
  17. linux账号安全管理,保证Linux系统安全——帐号管理
  18. [Linux系统编程]_文件编程(一)
  19. WPF自定义控件(教程含源码)-圆形进度条、环形进度条
  20. matlab2013b电机模型,电机数学模型完整版

热门文章

  1. O(logn)在两个有序数组找第k小的数
  2. 服务架构:统一身份认证和授权技术解决方案
  3. 2007年最新猪年春节拜年短信大全
  4. APP自动化测试定位元素位置
  5. 【python快速编程入门 第2版】第一章 python概述 习题
  6. 计算机应用专业中高职衔接专业优势,关于计算机应用专业中高职衔接的思考
  7. OSChina 周六乱弹 —— 下班调闹铃
  8. 技术分享 | 做为测试,那些不得不掌握的测试技术体系
  9. 3问数据挖掘:预测模型应该如何验证
  10. android 通过Canvas的应用而实现小游戏