簡體   English   中英

如何讓ipython了解對自寫模塊所做的更改?

[英]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.

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