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.py
:from ..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=这里有一个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__