问题描述
我有这样的布局:
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
开始尝试。