当我的文件彼此导入时,导入不起作用

时间:2016-02-14 17:57:58

标签: python import

这种类型的问题让我昨晚停留的时间超过了应有的时间,所以要把答案扔出去,因为我无法在堆栈上找到这个特殊的错误。

说我有两个文件。 my_function.py和variable.py

在my_function.py

from variable import a

def double(n):
    return 2 * n

print(double(a))

在variable.py

from my_function import double

a = 4

我收到导入错误?怎么会?我有一个空的 init .py,它们在同一个目录中,我检查过我没有多次拼错。

为帮助确定您是否遇到此问题,您的回溯应指向两个不同的导入。

Traceback (most recent call last):
  File "/Users/Owner/Documents/Stack Questions/my_function.py", line 1, in <module>
    from variable import a
  File "/Users/Owner/Documents/Stack Questions/variable.py", line 1, in 
<module>
    from my_function import double
  File "/Users/Owner/Documents/Stack Questions/my_function.py", line 1, in <module>
    from variable import a
ImportError: cannot import name 'a'

3 个答案:

答案 0 :(得分:1)

import语句在解释器遇到它们时执行。在from my_function import double中到达variable.py时,解释器尚未达到a的定义,因此variable模块的全局范围尚未包含该名称。在评估my_function模块的主体时,解释器首先命中variable的import语句。此模块已存在于sys.modules中,因此从该处获取(模块仅导入一次)。但是,此模块仅部分初始化,因此它不包含您尝试导入的名称a,并且您获得了ImportError

有可能使循环进口工作,并且在某些情况下它们是较小的邪恶。但是,它们往往很脆弱,因此您需要非常小心进口订单和其他细微之处。如果可能,请避免使用它们。

在您的追溯中,似乎解释器实际上尝试两次导入my_function.py。这样做的原因是它首先在mdoule名称__main__下导入,然后再在名称my_function下导入。

答案 1 :(得分:0)

我写了两个相互依赖的文件。当my_function.py想得到一个时,variable.py希望得到一倍。它们都不可能发生。

要解决此问题,请避免编写相互依赖的模块。在我的例子中,我通过将变量作为参数而不是导入来解决这个问题。一旦我没有从彼此导入文件,只从一个文件导入到另一个文件,我的问题就解决了。

答案 2 :(得分:0)

尝试:

import variable

def double(n):
    return 2 * n

print(double(variable.a))

import my_function

a = 4

然后,在终端:

python variable.py

但是,你真的需要循环导入吗?

查找: Python circular importing?