【问题标题】:Issues with python 3 and relative importspython 3 和相关导入的问题
【发布时间】:2021-06-25 03:34:34
【问题描述】:

我有这样的布局:

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 子句周围显示错误

【问题讨论】:

  • "ImportError: 没有已知父包的尝试相对导入" 通常,您的“父包”将是 src 文件夹。您是否尝试过从外部运行程序?
  • 是的,我运行example_project,它位于src 目录中的examples 包中。而本项目使用src/library
  • @karlknechtel 但即使我从src/examples 目录中运行代码,它仍然会抛出相同的错误
  • 不,我是说你应该完全离开src

标签: python relative-import


【解决方案1】:

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

【讨论】:

  • 对不起,我已经更新了相关布局。我已经有了这些文件
【解决方案2】:

library.some_library_code import Something尝试。

【讨论】:

  • 对不起,我已经更新了相关布局。我已经有了这些文件
【解决方案3】:

还原 sys 路径 hack,而是将代码运行为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多