当前位置: 首页 > 知识库问答 >
问题:

Python错误-ImportError:尝试在没有已知父包的情况下进行相对导入[duplicate]

米景辉
2023-03-14

因此,我的文件/文件夹结构如下:

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

project/server/main.py内部,我试图使用以下语法导入project/utils/module.pyfrom..utils.module import my_函数

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

我在这里读了几十个关于堆栈溢出的答案,但是没有一个使用这样的例子。

共有2个答案

叶衡虑
2023-03-14

您可以不使用from..util.module import my_函数而尝试直接导入my_函数。

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

希望它能起作用。

施驰
2023-03-14

这里有一个参考资料可以很好地解释这个问题。基本上,问题在于运行独立脚本时未设置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

文件结构

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

project/server/main.py

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

输出

$ python3 project/server/main.py
None

正如我们所看到的,\uuuuu package\uuuu的值是None。这是一个问题,因为它是此处所述相对进口的基础:

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

... 如PEP 366中所定义,此属性用于计算主模块的显式相对导入,而不是使用\uuuuuuu name\uuuuuuu。。。

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

提议的主要变化是引入了一个新的模块级属性,\uuuuuu-package\uuuu。当它存在时,相对导入将基于此属性,而不是模块\uuuuu name\uuuu属性。

要解决此问题,可以通过-m标志将其作为模块运行,而不是独立脚本。

输出

$ 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

现在,设置了\uuuuuuuuuuuuuuuuuuuuuuuuuu,这意味着它现在可以解析如上所述的显式相对导入。

 类似资料: