python 3 和相对导入的问题

问题描述

我有这样的布局:

src
   __init__.py
   main.py
   examples
      __init__.py
      example_project.py
   library
      __init__.py
      some_library_code.py

example_project.py 使用来自 some_library_code.py
代码 我像这样运行 example_project.py
***\src>: python examples\example_project.py 并获得 ImportError: attempted relative import with no kNown parent package
我已经阅读了一些关于 SO 的答案,发现我需要一些建设
sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.pardir)))
出现在example_project.py

我的 example_project.py 导入部分如下所示:

import os,sys
sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.pardir)))

from ..library import some_library_code

但这不起作用并显示相同的 ImportError

UPD
如果我将 from ..library ***** 更改为 from library ***** 那么它可以工作但 IDE 无法识别导入的类型并在 import 子句周围显示错误

解决方法

恢复 sys path hacks 并改为运行您的代码:

***\src>: python -m examples.example_project

这种方式告诉 python 运行位于 package example_project 中的 module examples。否则python无法(当您直接运行脚本时)知道该脚本是包的一部分 - 因此错误。 syspath hacks 会以微妙的方式失败(IDE 无法真正遵循那些动态 sys 路径添加 - 有一些设置,但随后开始变得复杂,因此 hack - 但即使是未定义的行为也会产生最坏的后果)同时运行你的脚本使用 -m 开关来自根包的父目录是运行脚本的推荐方式。

,

您忘记在 __init__.py 文件夹中添加 library。这是文档 https://docs.python.org/3/reference/import.html#regular-packages

,

library.some_library_code import Something 开始尝试。