首先明确,Python相对导入只能在同一package下而言的。

项目结构:

relativeimport
├── __init__.py
├── modfail2.py
├── pack1
│   ├── __init__.py
│   ├── mod1.py
│   ├── mod1_1.py
│   ├── pack2
│   │   ├── __init__.py
│   │   └── mod2.py
│   └── pack3
│       ├── __init__.py
│       └── mod3.py
├── packfail
│   ├── __init__.py
│   └── modfail.py
└── server.py

server.py文件

#server.py
import sys
print(sys.path)from pack1.mod1 import func1
from pack1.mod1_1 import func1_1
from pack1.pack2.mod2 import func2
from packfail.modfail import funcfail
func1()
func1_1()
func2()

modfail.py文件

#modfail.pyfrom ..pack1.mod1 import func1
def funcfail():print('funcfail')

server.py是根目下的主文件,运行报错,modfail.py导入顶层目录relativeimport下的mod1模块的func1函数失败:

Traceback (most recent call last):
  File "/relativeimport/server.py", line 4, in <module>
    from packfail.modfail import funcfail
  File "/relativeimport/packfail/modfail.py", line 1, in <module>
    from ..pack1.mod1 import func1
ValueError: attempted relative import beyond top-level package

失败原因:

attempted relative import beyond top-level package(超出了顶层package进行相对导入)

但是relativeimport目录下有__init__.py文件的,按理说也应该被当成package的,但是Python貌似有个坑爹的设定,当前目录不会被当做package(也就是server.py所在的relativeimport目录),所以自然就不能进行相对导入了。

改一下server.py文件

import sys
print(sys.path)from pack1.mod1 import func1
from pack1.mod1_1 import func1_1
from pack1.pack2.mod2 import func2from .modfail2 import funcfail2
func1()
func1_1()
func2()

Traceback (most recent call last):
  File "/relativeimport/server.py", line 9, in <module>
    from .modfail2 import funcfail2
ModuleNotFoundError: No module named '__main__.modfail2'; '__main__' is not a package

相对导入 relativeimport目录下的modfail2.py模块的funcfail2失败,说是'__main__' is not a package,就是当前的relativeimport目录就不是一个package,就是Python的那个坑爹设定,不会把项目入口的当前目录当做package。

改成绝对导入一起正常。

modfail.py

#modfail.py
# from ..pack1.mod1 import func1 #相对导入错误
from pack1.mod1 import func1 #绝对导入正确
def funcfail():print('funcfail')
#server.py #server.pyimport sys
print(sys.path)from pack1.mod1 import func1
from pack1.mod1_1 import func1_1
from pack1.pack2.mod2 import func2from packfail.modfail import funcfail
# from .modfail2 import funcfail2 #相对导入错误
from modfail2 import funcfail2 #绝对导入正确
func1()
func1_1()
func2()
funcfail()
funcfail2()

要用相对导入必须要统一package中。pack1下就是相对导入的例子,一切正常木有错误:
pack1结构:

mod2.py

#mod2.pyfrom ..mod1_1 import func1_1
from ..pack3.mod3 import func3
def func2():print('func2')

mod3.py

#mod3.pydef func3():print('func3')

mod1.py

#mod1.pyfrom .mod1_1 import  func1_1
def func1():print('func1')

mod1_1.py

#mod1_1.pydef func1_1():print('func1_1')
全部正确输出:
func1
func1_1
func2
funcfail
funcfail2

Python相对导入:ValueError: attempted relative import beyond top-level package相关推荐

  1. python 顶层模块理解 ValueError: attempted relative import beyond top-level package

    package_0 ├── module_0.py ├── module_1.py ├── package_1 │ ├── __init__.py │ ├── module_2.py │ ├── mo ...

  2. 成功解决ValueError: attempted relative import beyond top-level package

    成功解决ValueError: attempted relative import beyond top-level package 目录 解决问题 解决思路 解决方法 解决问题 ValueError ...

  3. 【Python】报错:ValueError: attempted relative import beyond top-level package问题解决

    报错: 解决办法:在导入模板的文件里添加 import sys sys.path.append("..")

  4. 【attempted relative import beyond top-level package】

    F1 |------F1_1 | |--__init__.py | |--module1_1.py : class C1 |--__init__.py |--current.py | F2 |--__ ...

  5. ImportError: attempted relative import with no known parent package

    问题背景: 在windows中开发完对应的Pytest代码,在放到centos7.4时,出现这个错: 但是在windows中完美运行: 这个问题确实比较蛋疼,将近两三个小时浪费在这上面了: 概念理解: ...

  6. [译][python]ImportError:attempted relative import with no known parent package

    前言 在这篇文章中,我将会解析 ImportError: attempted relative import with no known parent package 这个异常的原因.当你在运行的py ...

  7. Python项目文件引用问题:ImportError: attempted relative import with no known parent package

    一.问题说明: 在做一个项目,采用包的形式进行文件组织,运行代码是会报错ImportError: attempted relative import with no known parent pack ...

  8. Python报错:ImportError: attempted relative import with no known parent package

    目录 一.问题 二.解决 一.问题 运行代码出现报错:ImportError: attempted relative import with no known parent package 问题原因: ...

  9. Python相对引用报错ImportError: attempted relative import with no known parent package的处理方法

    报错信息 ImportError: attempted relative import with no known parent package 报错信息的意思是尝试使用相对路径导入但找不到已知的父级 ...

最新文章

  1. 对 Jenkins+ANT+Jmeter 接口测试的实践
  2. api 创建zookeeper客户端_zookeeper分布式锁原理及实现
  3. 面试官灵魂的一击:你懂MySQL事务吗?
  4. 学校通用计算机保护,浅谈学校计算机教室软件系统的保护.docx
  5. TF之TFOD-API:基于tensorflow框架利用TFOD-API脚本文件将YoloV3训练好的.ckpt模型文件转换为推理时采用的.pb文件
  6. 【Python】核酸结果统计难?复旦博士生的操作火了......
  7. 深度学习学习7步骤_如何通过4个简单步骤为深度学习标记音频
  8. 泛型在继承方面的体现与通配符
  9. jq监听页面的滚动事件,
  10. 转载:面向站长和网站管理员的Web缓存加速指南
  11. python3.5 爬取mzitu网站图片
  12. 【密码学原理】密钥管理和分发——对称密钥分发
  13. 浅谈国内软件信息化项目项目立项管理办法
  14. ELK日志处理之Filebeat工作原理
  15. CF755F PolandBall and Gifts
  16. Java 从键盘输入数据到一维double数组中
  17. Unity项目-黑魂复刻(四)玩家控制器(翻滚以及跳跃操作改动)
  18. Word和Excel中的常用办公操作
  19. mysql的cpu使用率突然增高_mysql cpu使用率过高解决方法
  20. “鸡”不可失—— 咕咕机3代VS2代对比测评

热门文章

  1. 漫画人物头像总是画不好?快看看这些注意点你有没有中招!
  2. 芯片学生党必会的行业英文术语
  3. [JavaScript] JS求闭区间[min,max]的和
  4. oxc000014c解决方法
  5. 触摸屏键盘插件Virtual Keyboard 该怎么用 Virtual Keyboard 入门指南
  6. 微信小程序 MinUI 组件库系列之 badge 徽章组件
  7. 微信公众号编辑器哪个好
  8. disc性格测试结果分析(disc性格测试结果分析23个D16个C)
  9. 程序员写给老婆的代码
  10. NUC980开源项目38-4g上网