导入错误 - 发生了什么?

war*_*iuc 2 python python-3.x

Python导入.再次...

我有这个文件结构:

[test]
    start.py (from scripts import main)
    [scripts]
        __init__.py (empty)
        main.py (from . import install)
        install.py (from scripts import main # or # from . import main)
Run Code Online (Sandbox Code Playgroud)

我收到导入错误:

vic@wic:~/projects/test$ python3 start.py 
Traceback (most recent call last):
  File "start.py", line 2, in <module>
    from scripts import main
  File "/home/vic/projects/test/scripts/main.py", line 1, in <module>
    from . import install
  File "/home/vic/projects/test/scripts/install.py", line 1, in <module>
    from scripts import main
ImportError: cannot import name main
vic@wic:~/projects/test$
Run Code Online (Sandbox Code Playgroud)

我不明白:第一次from scripts import main工作(通过"工作",我的意思是它没有失败ImportError),第二次相同的代码给出ImportError: cannot import name main

到底是怎么回事?

更新:

我的问题不是关于循环进口.令我感到困惑的是,完全相同的代码from scripts import main第一次工作正常,然后第二次失败.

我想有一些我不理解的内部导入机制.

第一次语句导入模块时,第二次完全相同的代码尝试从模块导入名称.这是怎么回事?

Mar*_*ers 5

您创建了一个循环导入.你不能这样做.避免main从中导入install.

发生的事情是,一个模块在导入时是不完整的,直到整个顶层执行完毕.如果在执行期间它导入另一个(直接或间接)尝试再次导入原始模块的模块,则会失败.原始模块尚未完成导入.

换句话说,您正在创建一个圆形图:

start -> scripts.main -> scripts.install
              ^                |
              |                |
               ----------------
Run Code Online (Sandbox Code Playgroud)

您需要重新安排代码,而不需要mainscripts包中导入.

请参阅在模块中使用导入的"最佳实践"是什么?有关如何处理此问题的一些提示.

  • @warwaruk,第一个`来自脚本导入main`*不起作用.它失败了,带有ImportError.当第一次识别圆形时,当第二个"来自脚本导入主"出现时,它在*点*失败.我认为你被追踪显示两个导入的事实感到困惑,但这并不意味着它成功通过第一个:它是*在尝试执行第一个执行行的过程中*显示并失败. (3认同)