为什么不能加载模块?

问题描述

显示我的O(|S|^2)的目录结构:

|d|

project.py中的内容

t

project中的内容

tree project
project
├── config.py
├── __init__.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共享相同的名称
为什么同一个名字重要?

解决方法

如果您尝试查看__package__中的project.py,则在import project文件夹中project/以及{{ 1}}就在文件夹外面。这是因为,当您在文件夹中时,您正在导入模块 import project(即project文件),并且是从project.py文件夹外部导入的正在导入project/ 软件包(即您正在运行project文件)。

编写__init__.py时,您希望从当前程序包内部导入from . import x,但是由于没有程序包上下文,因此不能x

,

根据此答案: https://stackoverflow.com/a/35710527/4393278

__all__的作用是什么?

它从模块中声明语义上的“公共”名称。如果全部中有一个名称,则希望用户使用它,并且可以期望它不会更改。

`全部 = ['foo','Bar'] 表示从模块导入*时,仅导入 all 中的那些名称。

因此,如果要导入__all__文件中的任何内容,则无需定义project.py。另外我认为您不应该通过其路径导入文件。 因此,在您的__init__文件中,应该是这样。

from .project import *
from .config import *