千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:重庆千锋IT培训  >  技术干货  >  Python导入错误分析

Python导入错误分析

来源:千锋教育
发布人:xqq
时间: 2023-11-06 05:08:10

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

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

ImportError:NomudulenamedmyModule

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

pipinstall%module_name%

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

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

*当前目录

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

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

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

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

importsys

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/envpython3

#Exportedfunction

defas_int(a):

returnint(a)

#Testfunctionformodule

def_test():

assertas_int('1')==1

if__name__=='__main__':

_test()

以及myothermodule代码如下所示:

#!/usr/bin/envpython3

from.mymoduleimportas_int

#Exportedfunction

defadd(a,b):

returnas_int(a)+as_int(b)

#Testfunctionformodule

def_test():

assertadd('1','1')==2

if__name__=='__main__':

_test()

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

Traceback(mostrecentcalllast):

File"myothermodule.py",line3,in

from.mymoduleimportas_int

SystemError:Parentmodule''notloaded,cannotperformrelativeimport

3.循环导入

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

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

#a.py

print"ain"

importsys

print"bimported:%s"%("b"insys.modules,)

importb

print"aout"

printb.x

以及:

#b.py

print"bin"

importa

print"bout"

x=3

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

$pythona.py

ain

bimported:False

bin

ain

bimported:True

aout

Traceback(mostrecentcalllast):

File"a.py",line4,in

importb

File"/home/shlomme/tmp/x/b.py",line2,in

importa

File"/home/shlomme/tmp/x/a.py",line7,in

printb.x

AttributeError:'module'objecthasnoattribute'x'

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

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

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

以上内容为大家介绍了Python导入错误分析,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

python异步中selectors的使用

2023-11-14

python交集有什么作用?

2023-11-14

pythonfloat函数怎么用

2023-11-14

最新文章NEW

pythonreversed的反向迭代

2023-11-14

python匿名函数的命名规则

2023-11-14

python使用协程的缺点

2023-11-14

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>