Python从父包导入

mic*_*zer 5 python python-import

我在 Python 中导入时遇到了一些问题。

这是一个简单的例子来说明问题所在。

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

app
|---__init__.py
|---sub_app
    |---__init__.py
Run Code Online (Sandbox Code Playgroud)

代码:

应用程序/__init__.py

shared_data = {
    'data': 123
}

from sub_app import more_shared_data
print more_shared_data
Run Code Online (Sandbox Code Playgroud)

应用程序/sub_app/__init__.py

more_shared_data = {
    'data': '12345'
}
from app import shared_data
print shared_data
Run Code Online (Sandbox Code Playgroud)

但是我收到错误:

ImportError: No module named app
Run Code Online (Sandbox Code Playgroud)

如何将shared_data字典导入app/sub_app/__init__.py?

Ana*_*mar 2

您可以为此使用相对导入。例子 -

在你的app/sub_app/__init__.py-

more_shared_data = {
    'data': '12345'
}
from .. import shared_data
print shared_data
Run Code Online (Sandbox Code Playgroud)

这应该适用于您提供的简单示例,但它确实会导致循环导入、app正在导入sub_appsub_app正在导入app

对于更复杂的用例,在定义特定元素之前,您可能会遇到错误(如果导入 sub_app),然后sub_app/__init__.py尝试导入 app 并使用仅在 import 语句之后定义的那些元素sub_app。一个非常简单的例子,它会导致问题 -

app/__init__.py-

from .sub_app import more_shared_data
print(more_shared_data)

shared_data = {
    'data': 123
}
Run Code Online (Sandbox Code Playgroud)

app/sub_app/__init__.py-

more_shared_data = {
    'data': '12345'
}
from .. import shared_data
print(shared_data)
Run Code Online (Sandbox Code Playgroud)

现在,如果您尝试导入app,您将收到错误 -

>>> import app
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<some file>\__init__.py", line 1, in <module>
    from .shared import more_shared_data
  File "<some file>\sub_app\__init__.py", line 4, in <module>
    from .. import shared_data
ImportError: cannot import name 'shared_data'
Run Code Online (Sandbox Code Playgroud)

您应该重新考虑是否shared_data属于app/__init__.py,或者可以将其移动到sub_app/__init__.py,然后从那里导入app