为什么不能加载模块?

Why can't load the module?

显示我的project的目录结构:

tree project
project
├── config.py
├── __init__.py
└── project.py

project.py中的内容:

from . import config

def main():
    pass

if __name__ == '__main__':
    main()

__init__.py中的内容:

__all__ = ['project','config']
from project import * 
from . import config

config.py 为简单起见留空。

加载模块:

cd  project
import project

遇到错误信息: Parent module '' not loaded, cannot perform relative import

为什么不能 import project? 我发现如果 project.py 重命名为 myproject.py ,其他保持不变,import project 可以工作。
project 是否与模块 project.py 共享相同的名称?
为什么同名很重要?

根据这个答案:

What does __all__ do?

It declares the semantically "public" names from a module. If there is a name in all, users are expected to use it, and they can have the expectation that it will not change.

`all = ['foo', 'Bar'] means that when you import * from the module, only those names in the all are imported.

因此,如果您想在 project.py 文件中导入任何内容,则无需定义 __all__。另外我认为你应该导入一个文件而不是他们的路径。 所以,在你的 __init__ 文件中,它应该是这样的。

from .project import *
from .config import *

如果您尝试查看 project.py 中的 __package__,您会发现当您在 import project 文件夹中查看 import project 时,它从无变化,当您import project 就在文件夹外面。这是因为,当您在文件夹内时,您正在导入 module project(即 project.py 文件),并从 project/ 您正在导入 project 软件包 的文件夹(即您是 运行 __init__.py 文件)。

当写from . import x时,你期望从当前包中导入x,但是没有包上下文,因此它不能import .