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中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
python读文件逐行处理的示例代码分享
Dec 27 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
python实现根据ip地址反向查找主机名称的方法
Apr 29 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
python实现局部图像放大
Nov 17 Python
python playwrigh框架入门安装使用
Jul 23 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
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
详解python和matlab的优势与区别
2019/06/28 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
优秀士兵个人事迹材料
2014/01/19 职场文书
访谈节目策划方案
2014/05/15 职场文书
应届生自荐信
2014/06/30 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
监察建议书
2015/02/04 职场文书
闪闪的红星观后感
2015/06/08 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript