Python导入失败

时间:2016-08-14 17:19:41

标签: python python-3.x

有一些奇怪的导入错误,这是解释器报告的奇怪报道。

我使用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}的模块}

我做错了什么?

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