为什么 'from file import function_name' 在我的交互式 Python 会话中失败但在脚本中有效?

Why does 'from file import function_name' fail in my interactive Python session but works in a script?

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

from common_commands import func_one, func_two

但是出现这个错误:

ImportError: cannot import name 'func_two'

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

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

TL;DR: 自从开始互动 shell 以来,我已重命名 func_two。开始新的 shell 一切正常。

我学到了什么:

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

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

所以我决定在问这个问题之前做更多的实验,并了解到我可以根据需要重命名函数 after 启动 shell 但是直到我第一次以某种方式导入文件。

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

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