Python导入模块时遇到的错误分析


Posted in Python onAugust 30, 2017

当遇到无法导入某个python模块时,可能会是没有安装某个模块,也有可能是某模块在加载过程中失败,也有可能是陷入了循环导入的问题。本文详细解释了这个问题。

1. 模块未安装或者路径不对

ImportError: No mudule named myModule

有两种可能,一是该模块没有安装,一般可以用

pip install %module_name%

来解决。注意有时候模块安装包名并不等于要导入的模块名。这种情况下可以通过pip search | list命令来尝试找到正确的包。

另一种情况就是包虽然安装了,但当前运行的程序加载的路径有错。python运行时将从以下位置尝试加载python modules:

* 当前目录

* 环境变量$PYTHONPATH所指示的值,这是一个由“:”分隔的字符串,各个子字符串都是文件系统的一个路径。

* 标准库目录,如dist-site-packages下的模块。

* 在.pth文件中指定的路径,如果存在.pth文件的话。

可以使用以下方式来查看python运行时的包含路径:

import sys
print(sys.path)

在运行出错的脚本装头部加上这一段代码,然后在控制台中查看打印出来的python类库路径,检查安装包是否已包含在上述路径中。

***可以通过下面的方式将未包含在路径中的模块临时包含进来:***

sys.path.append("path/to/module")

另外,还可以在shell窗口中查看当前的python包含路径:

echo $PYTHONPATH

2. 无法导入已存在的模块

如果要导入的模块包含了native代码,并且native代码加载(初始化)失败时,就会导致这种错误。使用ssl, gevent等涉及native的模块时,如果对应的native程序并未安装,则会出现这样的错误。

另一种错误情况是,使用相对路径导入时,父模块还未导入成功。见下面的代码:

main.py
mypackage/
  __init__.py
mymodule.py
myothermodule.py

mymodule.py如下所示:

#!/usr/bin/env python3

# Exported function
def as_int(a):
  return int(a)

# Test function for module 
def _test():
  assert as_int('1') == 1

if __name__ == '__main__':
  _test()

以及myothermodule代码如下所示:

#!/usr/bin/env python3

from .mymodule import as_int

# Exported function
def add(a, b):
  return as_int(a) + as_int(b)

# Test function for module 
def _test():
  assert add('1', '1') == 2

if __name__ == '__main__':
  _test()

如果执行mypackage/myothermodule,则会报以下错误:

Traceback (most recent call last):
 File "myothermodule.py", line 3, in <module>
   from .mymodule import as_int
SystemError: Parent module '' not loaded, cannot perform relative import
[这篇文章](#Relative imports in Python 3)给出了更详细的解答。

3. 循环导入

这种错误称之为"circular (or cyclic) imports"。是python独有的一种导入错误,在象java这样的语言中就不存在。

假设有如下两个文件,a.py和b.py:

#a.py
print "a in"
import sys
print "b imported: %s" % ("b" in sys.modules, )
import b
print "a out"
print b.x

以及:

#b.py
print "b in"
import a
print "b out"
x = 3

执行python a.py,将得到以下结果:

$ python a.py
a in          
b imported: False
b in
a in
b imported: True
a out
Traceback (most recent call last):
 File "a.py", line 4, in <module>
  import b
 File "/home/shlomme/tmp/x/b.py", line 2, in <module>
  import a
File "/home/shlomme/tmp/x/a.py", line 7, in <module>
  print b.x
AttributeError: 'module' object has no attribute 'x'

出现这种情况的原因是产生了循环导入。循环导入,以及在导入过程中python进行了加锁操作,最终导致在模块b未导入完成时就引用了其中的名字。

判断导入错误是否是因为循环导入引起的,主要看堆栈中是否出现两次重复的导入。比如上述堆栈中a.py出现两次,因此可以判断是这个文件引起的循环导入。

要解决这个问题,可以把模块看成一种资源,对所有要引入的模块进行编号,再按静态资源排序法顺次导入,就可以避免循环导入。

Python 相关文章推荐
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
python实现顺时针打印矩阵
Mar 02 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
浅谈pycharm使用及设置方法
Sep 09 Python
Pyqt5自适应布局实例
Dec 13 Python
python单例设计模式实现解析
Jan 07 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
python实现发送邮件
Mar 02 Python
简单学习Python多进程Multiprocessing
Aug 29 #Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 #Python
Python实现文件内容批量追加的方法示例
Aug 29 #Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 #Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 #Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 #Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 #Python
You might like
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
基于php实现的验证码小程序
2016/12/13 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
零基础写python爬虫之神器正则表达式
2014/11/06 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python lxml模块安装教程
2015/06/02 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
在校硕士自我鉴定
2014/01/23 职场文书
考试作弊检讨书
2015/01/27 职场文书
领导干部失职检讨书
2015/05/05 职场文书
礼貌问候语大全
2015/11/10 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
利用Python多线程实现图片下载器
2022/03/25 Python