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中的文件和目录操作实现代码
Mar 13 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
python将txt文件读取为字典的示例
Dec 22 Python
对python周期性定时器的示例详解
Feb 19 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
python 字符串追加实例
Jul 20 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
python实现登录与注册系统
Nov 30 Python
python unichr函数知识点总结
Dec 16 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 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
自动跳转中英文页面
2006/10/09 PHP
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
在vue项目中使用sass的配置方法
2018/03/20 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
分分钟入门python语言
2018/03/20 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python实现数据分析与建模
2019/07/11 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Django权限设置及验证方式
2020/05/13 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
python help函数实例用法
2020/12/06 Python
文明礼仪标语
2014/06/13 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
结婚纪念日感言
2015/08/01 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
python Django框架快速入门教程(后台管理)
2021/07/21 Python
mysql的Buffer Pool存储及原理
2022/04/02 MySQL