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?
您可以为此使用相对导入。例子 -
在你的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_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
}
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。
| 归档时间: |
|
| 查看次数: |
4769 次 |
| 最近记录: |