繁体   English   中英

Python导入失败

[英]Python import failure

遇到了一些奇怪的导入错误,这是解释器报告的异常错误。

我使用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

我做错了什么?

最好导入相对路径,而不是绝对路径。 我不知道您要达到什么目的,但是从同一级别的文件导入内容的正确方法是使用点. 因此,在您的first文件中使用类似以下内容:

from .second import var as second_var
var = second_var

inner/__init__.py文件中,如下所示:

from .first import var as first_var
var = first_var

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

编辑:

另外,如果您不main.py python,请考虑在main.py模块中添加解释器注释。 对于类Unix系统(OS X,Linux等)的用户来说非常方便

#!/usr/bin/env python3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM