0

我正在将几个 Python 文件之间共享的常用函数移到第三个 common_commands.py 文件中。为了测试函数,我使用以下方法导入了几个函数:

from common_commands import func_one, func_two

但是得到了这个错误:

ImportError: cannot import name 'func_two'

所以我只尝试导入func_one并且效果很好,但是导入func_two又给了我同样的错误!为什么?!为了让事情变得更加混乱,当我将上面完全相同的导入行放在我正在重构的脚本中时,它工作得非常好。

是什么导致了这种奇怪的行为?

4

1 回答 1

1

TL;DR:func_two自从启动交互式 shell 以来, 我已经重命名了。启动一个新的 shell 让一切正常。

我学到的是:

我不了解交互式 shell 的所有内部工作原理以及调用 import 时会发生什么,但是在退出并启动新 shell 后,完全相同的 import 调用起作用了。

当我启动 shellfunc_twoold_func_two,我决定重命名它,然后我尝试用新名称导入它,但失败了。在挠了挠头并做了一些 google foo 之后,我没有发现任何对我的情况有帮助的东西,并尝试启动一个新的 shell 并且它起作用了!

所以我决定在问这个问题之前做更多的试验,并了解到我可以启动 shell 后尽可能多地重命名函数,但直到我第一次以某种方式导入文件。

也就是说,一旦我调用,from common_commands import func_one我就不能再重命名任何函数并用新名称导入它们,因为文件已经被导入。但是,我仍然可以导入old_func_two. 我还尝试在导入后更改 func_two 的“胆量”,然后再次导入它并保持原来的行为。因此,据我所知,第一次导入文件(不是函数或类,而是整个文件)时,它会被缓存,并且所有未来的导入都在缓存版本上运行,而不是磁盘上的真实文件。

因此,即使您只导入func_oneiefrom common_commands import func_one然后重命名或更改func_two然后导入它,您也必须使用原始名称,func_two并且您也将获得原始功能,即使您之前没有明确导入它。

于 2020-03-05T16:49:50.677 回答