簡體   English   中英

為什么“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_one func_two了我同樣的錯誤! 為什么?! 更令人困惑的是,當我將它放入我正在重構的腳本中時,上面完全相同的導入行工作得非常好。

是什么導致了這種奇怪的行為?

TL;DR:自從啟動交互式 shell 以來,我已將其重命名為func_two 啟動一個新的 shell 使一切正常。

我學到的是:

我不了解交互式 shell 的所有內部工作原理以及調用 import 時會發生什么,但是在退出並啟動新 shell 后,完全相同的 import 調用起作用了。

當我啟動 shell func_twoold_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM