Python 同级相对导入错误:“没有已知的父包”

问题描述 投票:0回答:1

我想从子包导入模块,所以我去了这里从父文件夹子文件夹相对导入模块,由于它不起作用,我阅读了堆栈上的所有文献,发现了一个可以重现但无法解决的较小问题。

我想使用相对导入,因为我不想处理 sys.path 等,并且我不想安装项目的每个模块以在任何地方导入。我想让它与相对导入一起工作。

我的项目结构:

project/
    __init__.py
    bar.py
    foo.py
    main.py

bar.py:

from .foo import Foo

class Bar():

    @staticmethod
    def get_foo():
        return Foo()

foo.py:

class Foo():
    pass

main.py:

from bar import Bar

def main():
    f = Bar.get_foo()

if __name__ == '__main__':
    main()

我正在使用

python main.py
从终端运行项目代码,我得到以下信息:

Traceback (most recent call last):
  File "**omitted** project/main.py", line 1, in <module>
    from bar import Bar
  File "**omitted** project/bar.py", line 1, in <module>
    from .foo import Foo
ImportError: attempted relative import with no known parent package

为什么我会收到此错误?看来 bar 无法将项目识别为父包,但是:

  • __init__.py
    就位
  • bar.py
    正在作为模块而不是脚本运行,因为它是从 main 调用而不是从命令行调用(因此
    __package__
    __name__
    应该就位以帮助解决相对导入 十亿的相对导入时间

为什么我会收到此错误?我错了什么?我已经工作了一段时间,只是将 cwd 的父级添加到 PYTHONPATH 中,但我想一劳永逸地解决这个问题。

python python-import relative-import
1个回答
0
投票

我建议查看这个关于 python3 中的相对导入的帖子。我能够通过两种不同的方式让您的导入工作:

  1. 将 main.py 移至父目录并调整导入。在这种情况下,结构将更新为更传统的样式,其中包脚本位于其自己的目录中。

更新结构:

main.py
project/
    __init__.py
    bar.py
    foo.py

main.py:

from project.bar import Bar

def main():
    f = Bar.get_foo()

if __name__ == '__main__':
    main()
  1. 如果您想保留当前的结构而不是将包脚本放在自己的目录中,请尝试将包的父目录添加到
    PYTHONPATH

main.py:

import sys
import os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(SCRIPT_DIR))
from project.bar import Bar

def main():
    f = Bar.get_foo()

if __name__ == '__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.