在练习Python中package的相对导入时,即from . import XXX

或者from .. import XXX

有时会遇到这样两个错误:SystemError: Parent module '' not loaded, cannot perform relative import

和ValueError: attempted relative import beyond top-level package

其实这两个错误的原因归根结底是一样的:在涉及到相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。

文件夹被python解释器视作package需要满足两个条件:

1、文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。

2、不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。

补充:在"from YY import XX"这样的代码中,无论是XX还是YY,只要被python解释器视作package,就会首先调用该package的__init__.py文件。如果都是package,则调用顺序是YY,XX。

另外,练习中“from . import XXX”和“from .. import XXX”中的'.'和'..',可以等同于linux里的shell中'.'和'..'的作用,表示当前工作目录的package和上一级的package。

举个例子:

目录树testIm/

--__init__.py

--main.py : from Tom import tom

--Tom/

--__init__.py : print("I'm Tom's __init__!")

--tom.py : from . import tomBrother, from .. import kate,print("I'm Tom!")

--tomBrother.py print(I'm Tom's Brother!)

--Kate/

--__init__.py : print("I'm Kate's __init__!")

--kate.py

运行文件:main.py

结果I'm Tom's __init__!

I'm Tom's Brother!

Traceback (most recent call last):

File "D:\PythonLearning\TestIm\main.py", line 3, in from Tom import tom

File "D:\PythonLearning\TestIm\Kate\kate.py", line 4, in from .. import kate

ValueError: attempted relative import beyond top-level package>>>

可以看到from . import tomBrother顺利执行,首先执行了Tom文件夹下的__init__.py文件,后来执行了tomBrother.py文件,但是当执行到“from .. import kate”时报错,这是因为我们是在TestIm文件夹下把main.py文件作为主函数的入口执行的,因此尽管TestIm文件夹中有__init__.py文件,但是该文件夹不能被python解释器视作package,即Tom package不存在上层packge,自然会报错,相对导入时超出了最高层级的package。

修改方法:

目录树test/

--main.py : from testIm.Tom import tom

--testIm/

--__init__.py

--Tom/

--__init__.py : print("I'm Tom's __init__!")

--tom.py : from . import tomBrother, from .. import Kate,print("I'm Tom!")

--tomBrother.py print(I'm Tom's Brother!)

--Kate/

--__init__.py : print("I'm Kate's __init__!")

--kate.py

运行文件:main.py

结果I'm top's __init__!

I'm Tom's __init__!

I'm Tom's Brother!!

I'm Kate's __init__!

I'm Tom!

即主函数入口不在TestIm中,则TestIm和其同样包含__init__.py文件的子文件夹都被python解释器视作package,形成相应的嵌套关系。可以正常使用from . import XXX和from .. import XXX。

python中import的作用_python使用import报错是什么原因相关推荐

  1. python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch

    今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...

  2. python中赋值语句的作用_python中return可以使用赋值语句吗?

    在python中,有各种不同类型的语句.一个python程序是由模块构成的;一个模块由一条或多条语句组成;每个语句由不同的表达式组成;表达式可以创建和操作对象.下面来看看python中的语句. 赋值语 ...

  3. python中get函数作用_python get函数有什么作用?示例解析

    这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答. 描述 Python 字典(Dictionar ...

  4. python中注释的作用_python注释是什么意思

    注释即对程序代码的解释,在写程序时需适当使用注释,以方便自己和他人理解程序各部分的作用.在执行时,它会被Python解释器忽略,因此不会影响程序的执行. Python支持单行注释与多行注释,具体如下所 ...

  5. python中逗号的作用_Python中逗号作用的实例分析

    逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11 >>> b=(a) >>> b 11 >>> b=(a,) ...

  6. python中count的作用_python中函数COUNT()的功能是什么

    python中函数COUNT()的功能是统计字符串里某个字符出现的次数,语法为[str.count("char", start,end)],其中str为要统计的字符,star为索引 ...

  7. python中闭包的作用_Python闭包及其作用域

    Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...

  8. python中注释的作用_Python函数添加注释的好处

    前面的教程中,我们已经学习了 Python 中的注释方式,单行注释以#开头,进行多行注释时通常用三个单引号'''将注释部分包裹起来. 在函数的定义中,常利用多行注释给函数写文档,称为函数文档.为什么要 ...

  9. python中format函数作用_python中format函数什么意思

    python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...

最新文章

  1. java map在前端遍历_遍历循环输出map的几种方式
  2. 水晶报表——小代码,大作用(转自CSDN,阿泰)
  3. 创建Servlet项目(IDEA版)
  4. python和什么一起学_java和python可以一起学吗
  5. c 读取url中的html文本,如何使用Guzzlehttp获取给定url的html内容
  6. postgresql cast转换类型
  7. [翻译]SQL Server 该做和不该做的
  8. GridView点击行触发SelectedIndexChanged事件
  9. 《Unix网络编程》环境搭建
  10. php的垃圾回收机制
  11. 360 自动 html 极速模式,用Meta标签代码让360双核浏览器默认极速模式打开网站不是兼容模式(顺带解决很多兼容性问题)...
  12. nuxt.js框架使用vue-waterfall-easy插件如何引入--语法引用
  13. 数独基本规则_独数游戏,数独题目大全
  14. UE5——Actor生命周期——销毁
  15. 榆熙电商:在拼多多开网店如何计算产品价格弹性区间?
  16. delphi中setTimer函数的用法
  17. 洛谷P3975【天津省选2015】(后缀自动机DP)
  18. opencv 稀疏光流 稠密光流
  19. snprintf_s解释
  20. python使用代理

热门文章

  1. mysql的增_MySQL之增_insert-replace
  2. c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现
  3. python基本符合_python 3-3(2019-11-06 ) Python基础 (三)
  4. 重装系统 linux启动windows系统文件在哪里,Win-Lin双系统重装Windows找回Linux启动
  5. 分时系统的用户具有独占性,因此一个用户可以独占计算机系统的资源.,课件2016计算机操作系统试题库(判断).doc...
  6. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
  7. Jackson ObjectMapper readValue过程
  8. 校验码(海明校验,CRC冗余校验,奇偶校验)
  9. (十)Linux之等待队列
  10. axios代理跨域 cli4_vuecli 3.0之跨域请求代理配置及axios路径配置 莫小龙