前言

在这篇文章中,我将会解析 ImportError: attempted relative import with no known parent package 这个异常的原因。当你在运行的python脚本。使用了相对引用方式 (类似import ..module) 去引用包时,可能会出现这个异常。

让我们来看看发生这个异常的例子。

问题

假设你有以下目录结构:

project
├── config.py
└── package├── __init__.py└── demo.py
复制代码

config.py 中包含一些应该在 demo.py 中使用的变量

  • project/config.py
count = 5
复制代码
  • project/package/demo.py
from .. import config
print("The value of config.count is {0}".format(config.count))
复制代码

当我们尝试运行demo.py时,会遇到以下错误:

E:\project> python demos/demo.py
Traceback (most recent call last):File "demos/demo.py", line 1, in <module>from .. import config
ImportError: attempted relative import with no known parent package
复制代码

python解释器抛出了没有父级包的异常。为什么?

让我们看看python解释器是如何解析相关模块。从 PEP 328 中,我们找到了关于 the relative imports(相对引用)的介绍:

Relative imports use a module’s __name__ attribute to determine that module’s position in the package hierarchy. If the module’s name does not contain any package information (e.g. it is set to __main__ ) then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.

相对导入通过使用模块的 __name__ 属性来确定模块在包层次结构中的位置。如果该模块的名称不包含任何包信息(例如,它被设置为 __main__ ),那么相对引用会认为这个模块就是顶级模块,而不管模块在文件系统上的实际位置。

换句话说,解决模块的算法是基于__name____package__变量的值。大部分时候,这些变量不包含任何包信息 ---- 比如:当 __name__ = __main____package__ = None 时,python解释器不知道模块所属的包。在这种情况下,相对引用会认为这个模块就是顶级模块,而不管模块在文件系统上的实际位置。

为了演示这个原理,我们来更新一下代码:

  • project/config.py
print('__file__={0:<35} | __name__={1:<20} | __package__={2:<20}'.format(__file__,__name__,str(__package__)))
count = 5
复制代码
  • project/package/demo.py
print('__file__={0:<35} | __name__={1:<20} | __package__={2:<20}'.format(__file__,__name__,str(__package__)))
from .. import config
print("The value of config.count is {0}".format(config.count))
复制代码

再次尝试运行一下,会得到以下输出:

E:\project> python demos/demo.py
__file__=demos/demo.py      | __name__=__main__    | __package__=None
Traceback (most recent call last):File "demos/demo.py", line 3, in <module>from .. import config
ImportError: attempted relative import with no known parent package
复制代码

正如我们所看到的,python解释器没有关于模块所属的包的任何信息( __name__ = __main____package__ = None ),因此它抛出了找不到父级包的异常。

解决方案一

  • 我们通过在其中创建一个新的空 __init__.py 文件来将项目目录转换为一个包。

  • 我们在项目目录的父目录中创建一个文件 main.py

toplevel
├── main.py
└── project├── __init__.py├── config.py└── package├── __init__.py└── demo.py
复制代码
  • toplevel/main.py
print('__file__={0:<35} | __name__={1:<20} | __package__={2:<20}'.format(__file__,__name__,str(__package__)))
import project.demos.demo
复制代码

执行一下新的示例,输出如下:

E:\toplevel>python main.py
__file__=main.py                             | __name__=__main__             | __package__=None
__file__=E:\toplevel\project\demos\demo.py   | __name__=project.demos.demo   | __package__=project.demos
__file__=E:\toplevel\project\config.py       | __name__=project.config       | __package__=project
The value of config.count is 5
复制代码

main.py 中导入 project.demos.demo 会设置相对引用的包信息( __name____package__ 变量)。现在,python解释器可以成功解析 project\demos\demo.py 中的相对引用了。

解决方案二

  • 我们通过在 project 文件夹中创建一个新的空 __init__.py 来将 project 目录转换为一个包。

  • toplevel 目录下通过 -m 参数来调用python解释器,去执行 project.demos.demo[1]

toplevel
└── project├── __init__.py├── config.py└── package├── __init__.py└── demo.py
复制代码

再次执行:

E:\toplevel>python -m project.demos.demo
__file__=E:\toplevel\project\demos\demo.py   | __name__=__main__        | __package__=project.demos
__file__=E:\toplevel\project\config.py       | __name__=project.config  | __package__=project
The value of config.count is 5
复制代码

运行该命令将自动设置包信息(__package__变量)。现在,python解释器可以成功解析 project\ demos\demo.py 中的相对引用了(甚至认为 __name __ = __ main__ )。

[1] 译者注:注意使用 -m 参数的时候,后面指定的执行文件没有 .py 后缀

import-error-relative-no-parent

注:转载请保留下面的内容

原文链接:www.napuzba.com/story/impor…

译文链接:vimiix.com/post/2017/1…

转载于:https://juejin.im/post/5a45c97951882572ed55e538

[译][python]ImportError:attempted relative import with no known parent package相关推荐

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

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

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

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

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

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

  4. Python 导包问题(importerror: attempted relative import with no known parent package)

    Python 导包问题(importerror: attempted relative import with no known parent package) 问题描述 解决方法 问题描述 今天想优 ...

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

    python包的引用,如果使用pypharm时候,引入包容易出错,解决方法如下 执行代码出现ImportError:attempted relative import with no known pa ...

  6. 相对导入问题解决,ImportError:attempted relative import with no known parent package

    前言 本文中,我将会分析报错 ImportError: attempted relative import with no known parent package 的原因.当运行python脚本,使 ...

  7. Pycharm: ImportError: attempted relative import with no known parent package解决方案

    不成熟的解决方案总结 1. 增加sources root,这样被引用的py中的相对路径(特指在路径前一个点两个点这种情况)就能使用了: 2. 引用其他py,不想使用全路径,可以右键被引用的py 复制他 ...

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

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

  9. (已解决)ImportError attempted relative import with no known parent package

    想要调用同一目录下的另一个py文件中的类,以下或许是可行的解决方案. 需要做到两点 1. 将主调文件的名称改为__init__.py 2. from 被调文件的文件名称(删去末尾.py) import ...

最新文章

  1. Go语言中使用MySql数据库
  2. oracle更改归档日志路径,oracle修改归档日志的路径
  3. 关于UIAlertActionStyle的一些知识点
  4. 【java机器学习】支持向量机之拉格朗日乘子法解释
  5. java前端 js弹出框_前端js弹出框组件使用方法
  6. 概率论与数理统计(第四版) 第二章:随机变量及其分布(第一节和第二节笔记)
  7. 免费下载百度文库 道客巴巴 豆丁 等付费文档
  8. SublimeText3安装中文插件
  9. linux查询网络连接状态,Linux 查看网络连接状态
  10. 用于深度学习的演化神经AutoML
  11. 骨传导耳机的缺点有哪些?骨传导耳机的优缺点分析
  12. Delphi FastReport4.5安装说明
  13. 萌新向Python数据分析及数据挖掘 第二章 pandas 第一节 pandas使用基础QA 1-15
  14. JS获取跨域的cookie实例
  15. Markdown入门学习小结
  16. DSP_F28335入门(1)——新建工程之gel文件解释
  17. windows BOM
  18. PROE技巧【显示隐含的对象】【隐藏坐标】
  19. 操作系统实验ucore lab4
  20. 如何实现 请在微信客户端打开链接

热门文章

  1. 深入理解Linux内核-内存寻址
  2. php float浮点型 用round方法比较
  3. Android 核心分析 之六 -----IPC框架分析 Binder,Service,Se...
  4. 操作系统选择成固定模式 HTML5是潜在方向
  5. jquery_jquery插件、jqueryUI使用方法、自定义jquery插件(一个插件其实就是一个功能)...
  6. 视频直播网站开发千万不能忘的一个知识点
  7. 初识Service Worker
  8. MicroPython实例之TPYBoardv102自动浇花系统
  9. 【译】Asp.Net Identity Cookies 格式化
  10. Mysql元数据分析