首先明确,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. java计算机全部代码_(Java)谁有计算器的完整代码?
  2. ptyhon时间处理
  3. Pattern-No.03 设计模式之策略模式
  4. 电子认证服务许可证企业名单_工信部注销28家企业跨地区增值电信业务经营许可证...
  5. 实用UI设计需要学什么软件?
  6. 【LeetCode】7. Reverse Integer
  7. 前端工程师如何理解 TCP/IP 传输层协议?| 技术头条
  8. Nginx 从入门到放弃(三)
  9. Android pdfviewer的公章注释问题
  10. K60(Cortex-M4)开源开发探索(一)—— K60简介
  11. 基于stm32的智能风扇设计
  12. 用matlab的毕业设计,毕业设计课题: 用 MATLAB.ppt
  13. 通过二进制逻辑运算解题
  14. ARN的内存和CPU配置
  15. 机械原理(机电)_简要问答_笔记
  16. Java中hir_Java中数据库的使用基础
  17. 桌面运维工程师需要会哪些技能?主要是做什么的?
  18. E站账号cookie分享_产品经理必懂知识点—cookie和session
  19. Python 操作Excel(xlrd和xlwt)
  20. docker部署jupyterhub

热门文章

  1. ES学习构建EKL海量日志分析平台
  2. 美团开店宝Android pad,美团开店宝(com.sankuai.meituan.merchant) - 9.2.1 - 应用 - 酷安
  3. 开源并“免费”的Linux平台DAW——Ardour 4.0发布
  4. 海岱物联星空社团成员在第六届电子竞技全国高校联赛山东省总决赛中获佳绩
  5. android 仿微信选取相册_Android类似微信图片选择器
  6. 在c 语言里如何制作滑动图片大小,[教程]教你在微信小程序中实现手势缩放图片...
  7. 168640-82-2,Azide-PEG4-Tos含有叠氮化物(N3)基团和对甲苯磺酰基的杂功能交联剂
  8. 爬虫项目七:Python对唯品会商品数据、评论数据的爬取
  9. Java版本微信授权登录(升级版)
  10. 2021大纲新增词汇