[英]Why does my python import statement fail when I import this function from outside the directory?
[英]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_one
func_two
了我同樣的錯誤! 為什么?! 更令人困惑的是,當我將它放入我正在重構的腳本中時,上面完全相同的導入行工作得非常好。
是什么導致了這種奇怪的行為?
TL;DR:自從啟動交互式 shell 以來,我已將其重命名為func_two
。 啟動一個新的 shell 使一切正常。
我學到的是:
我不了解交互式 shell 的所有內部工作原理以及調用 import 時會發生什么,但是在退出並啟動新 shell 后,完全相同的 import 調用起作用了。
當我啟動 shell func_two
是old_func_two
但后來我決定重命名它,然后我嘗試用新名稱導入它,但失敗了。 在抓撓我的頭並做了一些 google foo 之后,我發現沒有任何幫助,並嘗試啟動一個新的 shell 並且它起作用了!
所以我決定在問這個問題之前做更多的實驗,並了解到我可以在啟動 shell后根據需要重命名函數,但只能在我第一次以某種方式導入文件之前。
也就是說,一旦我from common_commands import func_one
調用from common_commands import func_one
我就不能再重命名任何函數並用新名稱導入它們,因為文件已經導入。 但是,我仍然可以導入old_func_two
。 我還嘗試在導入后更改 func_two 的“膽量”,然后再次導入它並保持原始行為。 因此,據我所知,第一次導入文件(不是函數或類,而是整個文件)時,它會被緩存,以后所有的導入都在緩存版本上運行,而不是磁盤上的真實文件。
因此,即使您只導入func_one
ie from common_commands import func_one
然后重命名或更改func_two
然后導入它,您也必須使用func_two
的原始名稱,並且您也將獲得原始功能,即使您沒有't 之前明確導入它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.