Python 导入模块时的dot_模块和dot_dot_模块

Python 导入模块时的dot_模块和dot_dot_模块,python,import,Python,Import,我看到很多人在项目中使用以下导入方法: from .module1 import a,b from ..module2 import * 模块1和模块2是.py文件,但不是包的文件夹。导入模块与导入模块有什么区别?这是否意味着要在当前文件夹和../文件夹中导入模块?但当我尝试导入同一文件夹中的另一个文件时,它说: import .other >>> SyntaxError: Invalid syntax from .other import * >>> Va

我看到很多人在项目中使用以下导入方法:

from .module1 import a,b
from ..module2 import *
模块1和模块2是
.py
文件,但不是包的文件夹。导入模块与导入模块有什么区别?这是否意味着要在当前文件夹和../文件夹中导入模块?但当我尝试导入同一文件夹中的另一个文件时,它说:

import .other
>>> SyntaxError: Invalid syntax
from .other import *
>>> ValueError: Attempted relative import in non-package
我很好奇。谢谢~

您看到的是相对导入。它们允许您通过指定模块的相对路径来导入模块,而无需硬编码定义模块的包的名称

这是否意味着要在当前文件夹和../文件夹中导入模块

有关更多详细信息,请参阅。注意它说:

相对导入必须始终使用来自导入的
<代码>导入始终是 绝对的

这就是为什么在尝试导入.foo时会出现
SyntaxError

ValueError
可能是因为您正在以脚本的形式运行导入文件(这让我很困惑)。您需要将其作为一个包运行(使用
-m
开关),以便相关导入工作。也就是说,假设
foo.py
relative导入了其他模块,您就不能运行它了

$ python foo.py  # non-package error
相反,你是这样做的

$ python -m foo

请参阅相关问题:。

谢谢~我是第一次知道
相对导入
。我使用
import a
在解释器中尝试了该测试,其中包含
from.other import*
。因此,在这种情况下,它不是
\uuuuu main\uuuu
。我还尝试了
python-ma
,甚至尝试了
python-mb
的新脚本b(包含
import a
)。它仍然会引发相同的值错误…@platinhom您可以在OP中布局您的目录结构吗?目录结构是:a.py、b.py和other.py都在同一个文件夹中。我在这个文件夹中添加了一个init.py,使它看起来像一个包。但是运行b.py(
导入a
)仍然不起作用。但是,当我将b.py移动到上面的文件夹(
b.py
test/a.py
test/other.py
test/\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
)并将b.py修改为
import test.a
)时,来自其他导入的
起作用了!似乎有必要将
a.py
作为包中的一个模块。@platinohm没错,您运行的文件必须在包中(正如
-m
应该说明的那样)。顺便说一句,如果您使用的是Python3,
\uuuu init\uuuuu.py
不是声明包所必需的,尽管有些人还是喜欢它。谢谢。我仍然对他们的概念有点困惑,但我会进一步检查~