这种类型的问题让我昨晚停留的时间超过了应有的时间,所以要把答案扔出去,因为我无法在堆栈上找到这个特殊的错误。
说我有两个文件。 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'
答案 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
但是,你真的需要循环导入吗?