首页 / 知识
Python导入错误分析
2023-11-12 13:40:00
当遇到无法导入某个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相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
linux命令行看代码?
linux命令行看代码?,代码,基础,系统,命令,数字,工作,情况,进程,程序,终端,在Linux命令终端中查看和编辑曾执行过的命令1、使用历史命令:在终端linux防火墙标准命令?
linux防火墙标准命令?,状态,系统,服务,网络,工具,软件,标准,防火墙,地址,信息,Linux关闭防火墙几种命令在Linux中,关闭防火墙的命令取决于您正linux命令代码怎么看?
linux命令代码怎么看?,时间,系统,代码,命令,状态,工具,情况,电脑,实时,基础,linux查看系统命令是什么有的,Linux中有多个命令可以用于查看文件linuxvi命令路径?
linuxvi命令路径?,系统,状态,信息,工作,命令,管理,环境,电脑,网上,名称,linux的vi命令怎么进去在命令模式下输入“:”即可切换到末行模式,然后输比较好用的Python代码编辑器
比较好用的Python代码编辑器,代码,平台,环境,培训,教育,设计,数据,办公,人员,分析,Python是一款非常简单的编程语言,其功能使用起来都十分方便pycharm无法输入代码?
pycharm无法输入代码?,代码,环境,工具,分析,输入法,键盘,性能,计算机,问题,版本,PyCharm是一款Python语言开发的集成开发环境(IDE),它是许多PythoPython常用时间模块有哪些?
Python常用时间模块有哪些?,时间,信息,模块,培训,代码,灵活,字符串,日期,小时,实例,在编写代码的过程中,我们经常需要与时间打交道,所以说掌握时让Python代码更易维护的工具
让Python代码更易维护的工具,代码,工具,标准,项目,质量,地方,更正,一致,变动,软件,检查你的代码的质量,通过这些外部库使其更易维护。可读性很大学生报名Python培训课程的好处是
大学生报名Python培训课程的好处是什么?,培训,企业,社会,项目,行业,工作,时间,技术,都会,素养,一、报名学习前沿技术在IT行业,技术在不断变化和python代码的规范建议
python代码的规范建议,代码,异常,二元,设计,数字,下降,一致,培训,标准,空行,1.一致性的建议打破一条既定规则的两个好理由当应用这个规则将导线上Python培训和线下有什么不同?
线上Python培训和线下有什么不同?,培训,基础,实战,电脑,项目,教育,时间,地方,初级,技术,学习互联网技术的人越来越多,很多机构都采取线上和线下Python 代码混淆和加密技术
Python 代码混淆和加密技术,代码,工作,培训,技术,风险,在线,商业,对外,网站,位置,动机Python进行商业开发时,需要有一定的安全意识,为了不被