Python相对导入脚本有两个级别

Luk*_*lor 30 python directory-structure python-import python-3.x relative-import

在过去的一小时里,我一直在为我的包裹中的进口做斗争.

我有一个像这样的目录结构:

main_package
 |
 | __init__.py
 | folder_1
 |  | __init__.py
 |  | folder_2
 |  |  | __init__.py
 |  |  | script_a.py
 |  |  | script_b.py
 |
 | folder_3
 |  | __init__.py
 |  | script_c.py
Run Code Online (Sandbox Code Playgroud)

我想访问代码script_b.py以及script_c.py来自的代码script_a.py.我怎样才能做到这一点?

如果我把一个简单的import script_b内部script_a.py,当我跑

from main_package.folder_1.folder_2 import script_b
Run Code Online (Sandbox Code Playgroud)

我遇到了一个

ImportError: no module named "script_b"
Run Code Online (Sandbox Code Playgroud)

为了访问script_c.py,我不知道.我无法找到有关访问两级文件的任何信息,但我知道我可以导入一级文件

from .. import some_module
Run Code Online (Sandbox Code Playgroud)

如何从中访问这两个文件script_a.py

tob*_*spr 34

要从script_a访问script_c和script_b,您将使用:

from ...folder_3 import script_c
from . import script_b
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用python3,您可以通过使用以下命令从script_a导入script_b:

import script_b
Run Code Online (Sandbox Code Playgroud)

但是,您应该使用绝对导入:

from mypackage.folder_3 import script_c
from mypackage.folder1.folder2 import script_b
Run Code Online (Sandbox Code Playgroud)

另见:Absolute vs Relative进口

  • @mrgloom 这意味着向上移动两个目录:当前目录:`.` 向上一个目录:`..` 向上两个目录:`...`。 (7认同)
  • ‘……’是什么意思? (3认同)
  • 它对我不起作用:在“script_a.py”中使用“from ...folder_3 import script_c”并运行“python script_a.py”会给出“ImportError:尝试在没有已知父包的情况下进行相对导入”。我正在使用Python 3.7。 (3认同)