2016-08-14 118 views
0

得到了一些奇怪的导入错误,这是由解释器报告的奇怪报道。Python导入失败

我使用的CPython-3.5

目录结构:

. 
+-- outer 
| +-- inner 
| | +-- __init__.py 
| | +-- first.py 
| | +-- second.py 
| +-- __init__.py 
+-- main.py 

main.py:

import outer.inner 
print(outer.inner.var) 

外/ __ 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语句:import outer.inner.second是没有崩溃执行,这句话结合命名outer像一个空包,没有(但应)模块命名inner

我该怎么办错了吗?

+0

所以'inner'试图从'outer'导入 - 为什么?为什么'first.py',例如,只是'from .second import var'? – jonrsharpe

+0

@jonrsharpe我对Python比较陌生,但我听说相对的进口产品颇有争议。无论如何,我只想知道,这里究竟做错了什么,不仅我应该怎么做 –

+0

看看https://docs.python.org/3/tutorial/modules.html,然后[编辑]澄清问题是否仍然需要。 – jonrsharpe

回答

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 

这可以避免名称冲突以及保持名称简单,唯一且通常更易读的代码。

编辑:

另外,如果你是NW到Python考虑您的main.py模块中添加翻译评论。对于类Unix系统(OS X,Linux等)的用户来说很方便

#!/usr/bin/env python3