Python错误-ImportError:尝试使用没有已知父包的相对导入[重复]

Posted

技术标签:

【中文标题】Python错误-ImportError:尝试使用没有已知父包的相对导入[重复]【英文标题】:Python error - ImportError: attempted relative import with no known parent package [duplicate] 【发布时间】:2021-10-27 19:01:20 【问题描述】:

所以,我的文件/文件夹结构如下:

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 时,我得到了标题中的错误。

我已经阅读了几十个关于堆栈溢出的关于这个主题的答案,但没有一个使用这样的例子。

【问题讨论】:

如果你的项目不止一个文件,一般来说运行python -m your.main.module比运行python your/main/module.py更明智,这样sys.path就用来查找主模块,而不是基于定义主模块。 在子目录中添加__init__.py并设置PYTHONPATH= 【参考方案1】:

这里有一个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__

...此属性用于代替__name__ 来计算主模块的显式相对导入,如 PEP 366...中所定义...

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

提议的主要更改是引入了一个新的模块级属性__package__。当它存在时,相对导入将基于此属性,而不是模块 __name__ 属性。

要解决此问题,您可以通过 -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__ 已设置,这意味着它现在可以解析上面记录的显式相对导入。

【讨论】:

【参考方案2】:

你可以尝试不使用 from ..util.module import my_function 而不是直接 import my_function。

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

希望它有效。

【讨论】:

以上是关于Python错误-ImportError:尝试使用没有已知父包的相对导入[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 2.7 中出现“ImportError:无法导入名称 HTTPSConnection”错误

pygame 错误:“ImportError:没有名为 'pygame' 的模块”

Python 请求 ImportError:无法导入名称 HeaderParsingError

Python、Django mod_wsgi、virtualenv 错误:ImportError: No module named os(路径不正确)

Python 2.7 Cx_Freeze: ImportError: No module named __startup__

Python 2.7 Cx_Freeze: ImportError: No module named __startup__