![](/img/trans.png)
[英]How do I make IPython reload a file passed to `ipython -i …`
[英]How do I make ipython aware of changes made to a selfwritten module?
嘗試自寫模塊時,最初幾次可能會以錯誤結束。
但是在修復這些錯誤時,ipython似乎並沒有注意到這一點。
是否有ipython命令重新加載新模塊? '清除'並不能解決問題。 到目前為止,唯一有效的方法是“退出”並開始新的會話。 但這也意味着重做迄今為止所做的一切。
或者我是否需要在模塊運行后向模塊中添加一些內部變量?
例:
from mymodule import readCSVts
import pandas as pd
data = readCSVts('file.csv')
TypeError Traceback (most recent call last)
<ipython-input-158-8f82f1a78260> in <module>()
----> 1 data = readCSVts('file.csv')
/home/me/path/to/mymodule.py in readCSVts(filename)
194 Cons_NaNs=hydroTS[(hydroTS.level.isnull())&(hydroTS.level.shift().isnull())&(hydroTS.level.shift(periods=2).isnull())]
195 #This is a pandas dataframe containing all rows with NaN
196 Cons_NaNs_count = len(Cons_NaNs)
197 Cons_NaNs_str = str(Cons_NaNs_count)
198 Cons_NaN_Name_joiner = [current_csv,';',Cons_NaNs]
--> 199 Cons_NaN_Name_str = ''.join(Cons_NaN_Name_joiner)
TypeError: sequence item 2: expected string, DataFrame found
好的,這很容易。 我在198行寫了一個拼寫錯誤,並寫了Cons_NaNs
而不是Cons_NaNs_str
,因此我明顯錯誤地嘗試用字符串連接數據幀。
但在mymodule.py
文件中修復它后,我得到以下(縮短)錯誤:
197 Cons_NaNs_str = str(Cons_NaNs_count)
198 Cons_NaN_Name_joiner = [current_csv,';',Cons_NaNs_str]
--> 199 Cons_NaN_Name_str = ''.join(Cons_NaN_Name_joiner)
TypeError: sequence item 2: expected string, DataFrame found
看一下追溯,ipython非常清楚在源文件中做了哪些更改,它表明我用丟失的_str
修復了錯字,但它仍然給出了一個錯誤,在第一次看起來似乎是不可能的。 運行clear
並重新導入所有內容后,它會顯示相同的行為。
所以為了確保我在整個過程中沒有犯下一個愚蠢的錯誤,我在ipython中逐步完成了整個模塊。 導致我到達那一點的每個變量都表現得如預期的那樣。
Cons_NaNs
是一個數據幀, Cons_NaNs_count
是一個整數, Cons_NaNs_str
是一個字符串。
所以我退出ipython,重新啟動它並重新導入所有內容,現在它可以工作了。
但不得不退出ipython很糟糕。 大多數時候,這意味着必須重新導入數十種內容並執行幾十個命令,以達到我可以實際測試我當前正在進行的操作的程度。
有一種Ipython特定的方式,你可以使用set up autoreload :
In [1]: %load_ext autoreload
In [2]: %autoreload 2
In [3]: from foo import some_function
In [4]: some_function()
Out[4]: 42
In [5]: # open foo.py in an editor and change some_function to return 43
In [6]: some_function()
Out[6]: 43
重新加載模塊而不顯式重新加載它,並且從foo import ...導入的對象也被更新。
用法提供以下魔術命令:
%autoreload
現在自動重新加載所有模塊(
%aimport
排除的模塊除外)。
%autoreload 0
禁用自動重新加載。
%autoreload 1
每次執行> Python代碼鍵入之前,每次重新加載使用%aimport導入的所有模塊。
%autoreload 2
每次執行鍵入的Python代碼之前,每次重新加載所有模塊(
%aimport
排除的模塊除外)。
%aimport
列出要自動導入或不導入的模塊。
%aimport foo
導入模塊'foo'並將其標記為自動重載為
%autoreload 1
%aimport -foo
將模塊'foo'標記為不自動重載。
還有dreload可以用於python2和3。
dreload(module)
這不僅適用於ipython
,但Python
通常會在首次導入sys.modules
時緩存模塊。 因此,在第一次導入后,每當您嘗試導入它時,您將從sys.modules
獲取緩存的模塊對象。
要使Python重新加載模塊對象而不必重新啟動Python,以便反映對模塊所做的更改,您應該使用reload()
內置函數(Python 2.x)或importlib.reload()
(Python 3.x ) 。
Python 2.x -
<module> = reload(<module>)
示例 -
import module
module = reload(module) #This requires the module as it is, not a string.
Python 3.x -
import importlib
<module> = importlib.reload(<module>)
與上面的Python 2.x
示例類似,只需使用importlib.reload()
而不是reload()
當您終止IPython筆記本服務器並重新啟動它時,您將擁有一個新的內核實例,該實例不會與您的筆記本本身持續存在。 您應該在打開筆記本后立即開始工作流程,方法是運行所有單元格。 在頂部菜單中,選擇“Cell-> Run all”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.