有一些奇怪的导入错误,这是解释器报告的奇怪报道。
我使用CPython-3.5
目录结构:
.
+-- outer
| +-- inner
| | +-- __init__.py
| | +-- first.py
| | +-- second.py
| +-- __init__.py
+-- main.py
main.py:
import outer.inner
print(outer.inner.var)
outer / __ init__.py:空
外/内/ __ INIT __ PY:
import outer.inner.first
var = outer.inner.first.var
外/内/ first.py:
import outer.inner.second
var = outer.inner.second.var
外/内/ second.py:
var = 1337
然后,我运行main.py
并且脚本失败并显示此堆栈跟踪:
Traceback (most recent call last):
File "main.py", line 1, in <module>
import outer.inner
File "/outer/inner/__init__.py", line 1, in <module>
import outer.inner.first
File "/outer/inner/first.py", line 2, in <module>
var = outer.inner.second.var
AttributeError: module 'outer' has no attribute 'inner'
因此,Python不希望正确绑定名称。虽然first.py:import outer.inner.second
中的import语句在没有崩溃的情况下执行,但是这个语句绑定到名为outer
的东西,就像一个空包,它没有(但应该)名为{{1}的模块}
我做错了什么?
答案 0 :(得分:2)
最好导入相对路径,而不是绝对路径。我不知道你想要实现什么,但是从同一级别的文件导入内容的正确方法是使用点.
所以在first
文件中使用类似:
from .second import var as second_var
var = second_var
在您的inner/__init__.py
文件中,例如:
from .first import var as first_var
var = first_var
这使您可以避免名称冲突,并保持名称简单,独特且通常更易读的代码。
编辑:
此外,如果您对python有兴趣,请考虑在main.py
模块中添加解释器注释。它对类Unix系统(OS X,Linux等)的用户来说很方便。
#!/usr/bin/env python3