ImportError:无法从“ __main __”

时间:2020-02-05 03:34:15

标签: python import

变量isDevelopment位于manager/__init__.py文件中:

 isDevelopment = True

在同一目录中,文件fusion.py尝试在文件级别导入它:

from . import isDevelopment

注意:pycharm与其矛盾:在任何情况下都不会标记导入:

enter image description here

尝试从其他位置导入它时,例如.. pycharm确实抱怨:

enter image description here

运行时

 python3 manager/fusion.py

发生以下情况:

 ImportError: cannot import name 'isDevelopment' from '__main__'

根据其中一项建议进行的另一尝试:

from ..manager import isDevelopment

结果是:

ValueError: attempted relative import beyond top-level package

为什么import尝试失败了?需要更改什么?

2 个答案:

答案 0 :(得分:1)

./test.py
./manager/__init__.py
./manager/fusion.py

__ init __。py

isDevelopment = True

./ manager / fustion.py

from . import isDevelopment

def checkDevelopment():
    print("isDevelopment = {0}".format(isDevelopment))

./ test.py

import manager

if __name__ == "__main__":
    print("isDevelopment = {0}".format(manager.isDevelopment))
    manager.checkDevelopment()

执行

python3 ./test.py

输出

isDevelopment = True
isDevelopment = True

问题

您是要执行manager / fusion.py来设置模块还是要使其成为可执行应用程序的一部分?如果您只是想知道管理器模块中isDevelopment的值,则可以实现。如果您希望管理器中包含可执行功能,请使用setup.py

探索入口点。

答案 1 :(得分:0)

__init__.py用于初始化程序包。根据{{​​3}}

上的文档

包的用户可以从包中导入各个模块

您不导入__init__.py中的内容,而是在导入时自动运行。

在最简单的情况下, init .py只能是一个空文件,但它也可以执行该程序包的初始化代码

由于isDevelopment不是模块,因此您无法导入它!如果您有另一个模块fusion2.py,则可以使用

导入
from . import fusion2

在那里您应该可以看到isDevelopment