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.py
:from ..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__
已设置,这意味着它现在可以解析上面记录的显式相对导入。
所以,我的 files/folders 结构如下:
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
时,我得到标题中的错误。
我在这里阅读了关于堆栈溢出的数十个关于此主题的答案,但其中 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__
已设置,这意味着它现在可以解析上面记录的显式相对导入。