下面关于python中模块导入的说法错误的是,python导入库的时候出错
热门阅读词汇
当一个python模块无法导入时,可能是没有安装,可能是加载过程中失败,也可能是陷入了循环导入的问题。本文对此问题进行了详细阐述。
1.模块未安装或路径错误。
导入错误:没有名为myModule的模块
有两种可能。第一,模块没有安装,一般可以使用。
pip安装%module_name%
来解决。请注意,有时模块安装包名称不等于要导入的模块名称。在这种情况下,您可以使用pip search list命令尝试找到正确的包。
另一种情况,虽然安装了包,但是当前运行程序的路径是错误的。Python运行时将尝试从以下位置加载python模块:
*当前目录
*由环境变量$PYTHONPATH指示的值,该值是由“:”分隔的字符串,每个子字符串都是文件系统的路径。
*标准库目录,如dist-site-packages下的模块。
*中指定的路径。pth文件,如果. pth文件存在。
您可以通过以下方式查看python运行时的包含路径:
导入系统
打印(系统路径)
将这段代码添加到错误运行的脚本的头中,然后在控制台中查看打印的python类库路径,检查安装包是否包含在上述路径中。
* * *未包含在路径中的模块可以通过以下方式临时包含:* * *
sys . path . append( path/to/module )
此外,您还可以在shell窗口中查看当前的python包含路径:
echo $PYTHONPATH
2.无法导入现有模块。
如果要导入的模块包含本机代码,而本机代码加载(初始化)失败,就会导致这个错误。在使用ssl、gevent等涉及native的模块时,如果没有安装相应的native程序,就会出现这种错误。
另一种错误情况是,使用相对路径导入时,父模块还没有导入成功。请参见以下代码:
main.py
我的包/
__init__。巴拉圭
mymodule.py
肌热模块
Mymodule.py如下:
#!/usr/bin/env python3
#导出的函数
def as_int(a):
返回int(a)
#模块的测试功能
def _test()。
assert as_int(1)==1
if __name__==__main__ :
_测试()
myothermodule代码如下:
#!/usr/bin/env python3
从。mymodule作为_int导入
#导出的函数
def add(a,b):
返回as_int(a) as_int(b)
#模块的测试功能
def _test()。
断言add(1 , 1)==2
if __name__==__main__ :
_测试()
如果执行my package/myothemodule,将会报告以下错误:
回溯(最近一次呼叫):
文件“myothermodule.py”中的第3行
从。mymodule作为_int导入
系统错误:父模块“”未加载,无法执行相对导入
【本文】(Python 3中的#相对导入)给出了更详细的答案。
3.循环导入
这种错误被称为“循环导入”。这是python特有的导入错误,java等语言中不存在。
假设有以下两个文件,a.py和b.py:
#a.py
打印“a in”
导入系统
print b imported:% s %(sys . modules中的 b ,)
导入b
打印“a输出”
打印b.x
并且:
#b.py
打印“b in”
导入a
打印“b输出”
x=3
执行python a.py,会得到以下结果:
$ python a.py
单
b进口:假
b在
单
b进口:对
出局
回溯(最近一次呼叫):
文件“a.py ”,第4行,在
导入b
文件/home/shlomme/tmp/x/b.py ,第2行,在
导入a
文件/home/shlomme/tmp/x/a.py ,第7行,在
打印b.x
AttributeError:“模块”对象没有属性“x”
原因是循环导入。循环导入,以及python在导入过程中的加锁操作,最终导致在导入完成前引用了模块B的名字。
判断导入错误是否是循环导入造成的,主要看栈中是否有两次重复导入。比如a.py在上面的栈中出现了两次,那么可以判断这个文件导致了循环导入。
要解决这个问题,可以把模块看作一种资源,把所有要引入的模块编号,然后按照静态资源排序的方法依次导入,避免循环导入。
相关文章
摘要
如果你觉得编程之家网站内容不错,欢迎向程序员朋友推荐编程之家网站。
此图文内容由网友收集提供,作为学习参考。版权归原作者所有。
如果你喜欢交流学习经验,点击链接加入交流群1: 1065694478(全)交流群2: 163560250。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。