从父包导入Python

米克泽

我在使用Python导入时遇到了一些麻烦。

这是发生问题的简单示例。

我有这样的目录结构:

app
|---__init__.py
|---sub_app
    |---__init__.py

代码:

app / __ init__.py

shared_data = {
    'data': 123
}

from sub_app import more_shared_data
print more_shared_data

app / sub_app / __ init__.py

more_shared_data = {
    'data': '12345'
}
from app import shared_data
print shared_data

但是我得到了错误:

ImportError: No module named app

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

阿南德·库玛(Anand S Kumar)

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

在您的app/sub_app/__init__.py-

more_shared_data = {
    'data': '12345'
}
from .. import shared_data
print shared_data

这应该适用于您提供的简单示例,但确实会导致循环导入,app正在导入sub_app并且sub_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
}

app/sub_app/__init__.py --

more_shared_data = {
    'data': '12345'
}
from .. import shared_data
print(shared_data)

现在,如果您尝试导入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'

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章