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

发布时间 - 2026-01-11 03:01:18    点击率:

当遇到无法导入某个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根据路径导入模块的方法  # Python创建模块及模块导入的方法  # Python中几种导入模块的方式总结  # Python在不同目录下导入模块的实现方法  # Python3导入自定义模块的三种方法详解  # python模块导入的细节详解  # python如何导入自己的模块  # Python导入模块的3种方式超级详细讲解  # 加载  # 也有  # 两次  # 可以通过  # 所示  # 则会  # 过程中  # 没有安装  # 安装包  # 都是  # 就会  # 是因为  # 出了  # 还可以  # 一是  # 可以用  # 这个问题  # 这是一个  # 不存在  # 这种情况 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何处理表单验证?(Requests代码示例)  轻松掌握MySQL函数中的last_insert_id()  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  详解Android中Activity的四大启动模式实验简述  如何在七牛云存储上搭建网站并设置自定义域名?  手机网站制作与建设方案,手机网站如何建设?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何快速搭建二级域名独立网站?  如何快速使用云服务器搭建个人网站?  如何批量查询域名的建站时间记录?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  做企业网站制作流程,企业网站制作基本流程有哪些?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  微信小程序 闭包写法详细介绍  Python进程池调度策略_任务分发说明【指导】  高端智能建站公司优选:品牌定制与SEO优化一站式服务  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  如何在万网主机上快速搭建网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  ,交易猫的商品怎么发布到网站上去?  js实现获取鼠标当前的位置  Android GridView 滑动条设置一直显示状态(推荐)  如何在自有机房高效搭建专业网站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何挑选最适合建站的高性能VPS主机?  javascript读取文本节点方法小结  java ZXing生成二维码及条码实例分享  Python文件异常处理策略_健壮性说明【指导】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  php打包exe后无法访问网络共享_共享权限设置方法【教程】  高防服务器如何保障网站安全无虞?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  如何彻底删除建站之星生成的Banner?  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  JavaScript如何实现错误处理_try...catch如何捕获异常?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何快速搭建高效可靠的建站解决方案?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  bootstrap日历插件datetimepicker使用方法