尝试自写模块时,最初几次可能会以错误结束.
但是在修复这些错误时,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
Run Code Online (Sandbox Code Playgroud)
好的,这很容易.我在第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
Run Code Online (Sandbox Code Playgroud)
看一下追溯,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
Run Code Online (Sandbox Code Playgroud)
重新加载模块而不显式重新加载它,并且从foo import ...导入的对象也被更新.
用法 提供以下魔术命令:
%autoreload
%aimport现在自动重新加载所有模块(除了那些模块除外).
%autoreload 0
禁用自动重新加载.
%autoreload 1每次执行> Python代码键入之前,每次重新加载使用%aimport导入的所有模块.
%autoreload 2
%aimport每次执行键入的Python代码之前,每次重新加载所有模块(排除的除外).
%aimport
列出要自动导入或不导入的模块.
%aimport foo
导入模块'foo'并将其标记为自动重载
%autoreload 1
%aimport -foo
标记模块'foo'不能自动重载.
还有dreload可以用于python2和3.
dreload(module)
Run Code Online (Sandbox Code Playgroud)
这不仅是对ipython的,但Python在一般的高速缓存当它第一次导入到一个模块sys.modules。因此,在第一次导入之后,每当您尝试导入它时,您都会从sys.modules.
要让 Python 重新加载模块对象而不必重新启动 Python,以便反映对模块所做的更改,您应该使用reload()内置函数 (Python 2.x)或importlib.reload()(Python 3.x)。
Python 2.x -
<module> = reload(<module>)
Run Code Online (Sandbox Code Playgroud)
例子 -
import module
module = reload(module) #This requires the module as it is, not a string.
Run Code Online (Sandbox Code Playgroud)
Python 3.x -
import importlib
<module> = importlib.reload(<module>)
Run Code Online (Sandbox Code Playgroud)
与Python 2.x上面的示例类似,只需使用importlib.reload()代替reload()