Python 相对导入attempted relative import beyond top-level package

摘要:
ValueError:尝试相关导入顶级包假定以下分层包目录1project/2__init__。py3包装/4__初始__。py5A/6__初始__。py7spam.py#*打印(“垃圾邮件”)*#8grok。py#*打印(“Ingrok”)*#9C/10__初始__。py11hel公司

ValueError: attempted relative import beyond top-level package

假设有如下层次包目录

1 project/
2     __init__.py
3     mypackage/
4         __init__.py
5         A/
6             __init__.py
7             spam.py     #* print("In spam") *#
8             grok.py     #* print("In grok") *#
9             C/
10                 __init__.py
11                 hello.py    #* print("In hello") *#
12         B/
13             __init__.py
14             bar.py      #* print("In bar") *#
15 run.py
16     main.py

相对导入语法

from . importmodule
from .. importmodule
from ... import module
相对导入与模块__name__有关
  • run.py作为顶层模块执行导入A.spam时
    • run.py的__name__等于 __main__
    • spam.py的__name__等于 A.spam
    • A成为顶层的包,所以相对导入最多​只能访问到A,A之外的层次结构是不可见的
  • main.py作为顶层模块执行导入mypackage.A.spam是
    • main.py的 __name__为 __main__
    • spam.py的__name__为mypackage.A.spam
    • mypackage成为顶层包,相对导入作用域扩大,B/包对spam.py可见
相对导入只适用于包中的模块,顶层的模块中将不起作用
  • 如果将run.py当作顶层执行模块
    • A/和 B/ 将成为toplevelpackage顶层包A/中的模块不能用相对导入来导入B/包中的模块,因为不能越过顶层包。
    • A/、B/包中的目录可以导入本包中及以下的模块
  • 如果将main.py当作顶层执行模块
    • mypackage/成为顶层包,A/可以访问到B/包,不会出现ValueError: attempted relative import beyond top-level package

例子

## run.py (run.py当作顶层执行模块,即 python run.py)
#-----------
importA.spam
## spam.py
#--------------
from . import grok      #ok
from .C import hello    #ok
from ..B import bar     #!Err 
                                                           ##—— ValueError: attempted relative import beyond top-level package
print('In spam') 
## main.py
#------------
importmypackage.A.spam
## spam.py
#-------------
from ..B import bar     #ok
print('In spam')
 

免责声明:文章转载自《Python 相对导入attempted relative import beyond top-level package》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]oracle在删除表表空间用户时,如何释放磁盘空间FLASHBACK介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ubuntu16 编译源码安装MXNet 可变卷积Deformable-ConvNets GPU版

【引言】最近接手了公司的关于虫子识别的项目,使用MXNet框架开发,但是实际用的是Deformable-ConvNets. Deformable-ConvNets为微软研究研究院提出的可变卷积网络,可用于对图像中大小不一的物体识别,不是单单识别图中的猫和狗(它们都一般大小),而识别图像中不同种类的虫子(虫子本身小,而且难以区分),在这样的场景下很适合用可变...

游戏辅助脚本(python)

本文介绍怎样用Python写游戏辅助脚本 主要实现方式是通过图片的对比,在游戏中就行点击。运行程序需要以下东西。 PIL: 图片处理模块     (python3 换成了 pillow)  下载地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/ pywin32 :  用来模拟点击用的      pip   ins...

用Python做股市数据分析(一)

本文由伯乐在线-小米云豆粥翻译。未经许可,禁止转载!英文出处:Curtis Miller。欢迎加入翻译组。 这篇博文是用Python分析股市数据系列两部中的第一部,内容基于我犹他大学 数学3900 (数据科学)的课程。在这些博文中,我会讨论一些基础知识。比如如何用pandas从雅虎财经获得数据, 可视化股市数据,平局数指标的定义,设计移动平均交汇点分析移动...

Python 基础(二)

一、def 函数 python 提供了函数功能,可以将想要在程序中重复使用的部分功能抽象成一个函数,以方便程序调用,或者提供给其他模块使用 def function_name(parameters): expressions python 使用 def 开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的具体功能实现代码,如果想要函数有...

robotframework的学习笔记(十三)------Robot Framework常用库简介

标准库Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字。自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式。 Collections:提供一组关键词处理Python列表和字典。 OperatingSystem:允许执行各种操作系统相关的任务。允许执行各种操作系统相...

Python基础(二)--基本数据类型、格式化输出、基本运算符

一、基本数据类型 1、数字类型 #int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary=float(3.1) 用于标识:工资,身高,体重 #int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-21...