Python error - ImportError: attempted relative import with no known parent package

Python error - ImportError: attempted relative import with no known parent package

所以,我的 files/folders 结构如下:

project/
├─ utils/
│  ├─ module.py
├─ server/
│  ├─ main.py

project/server/main.py 中,我正在尝试使用以下语法导入 project/utils/module.pyfrom ..utils.module import my_function.

我正在使用 VSCode,它甚至在我键入模块路径时为我自动完成。但是当我 运行 文件 project/server/main.py 时,我得到标题中的错误。

我在这里阅读了关于堆栈溢出的数十个关于此主题的答案,但其中 none 使用了这样的示例。

您可以尝试不使用 from ..util.module import my_function 而尝试直接导入 my_function.

如果它不起作用,您需要在 utils 文件夹和服务器文件夹下创建一个可以为空的新文件,命名为 __init__.py__init__.py 创建一个可以为任何模块调用的实际模块。

希望有用。

这里有个reference很好的解释了这个问题。基本上,问题是运行宁独立脚本时未设置__package__

文件结构

.
└── project
    ├── server
    │   └── main.py
    └── utils
        └── module.py

project/server/main.py

if __name__ == '__main__':
    print(__package__)

输出

$ python3 project/server/main.py
None

我们可以看到,__package__的值为None。这是一个问题,因为它是相对进口的基础,如 here:

__package__

... This attribute is used instead of __name__ to calculate explicit relative imports for main modules, as defined in PEP 366...

其中 PEP 366 进一步解释了这一点:

The major proposed change is the introduction of a new module level attribute, __package__. When it is present, relative imports will be based on this attribute rather than the module __name__ attribute.

要解决此问题,您可以 运行 通过 -m flag 而非独立脚本将其作为模块。

输出

$ python3 -m project.server.main  # This can be <python3 -m project.server> if the file was named project/server/__main__.py
project.server

project/server/main.py

from ..utils.module import my_function

if __name__ == '__main__':
    print(__package__)
    print("Main")
    my_function()

输出

$ python3 -m project.server.main
project.server
Main
My function

现在,__package__ 已设置,这意味着它现在可以解析上面记录的显式相对导入。