尝试自写模块时,最初几次可能会以错误结束。
但是在修复这些错误时,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糟透了。大多数时候,这意味着必须重新导入数十种内容并执行几十个命令,以便能够实际测试我目前正在进行的操作。
答案 0 :(得分:6)
有一种特定于Ipython的方式,您可以使用设置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
每次执行&gt;类型的Python代码之前,每次重新加载用%aimport导入的所有模块。
%autoreload 2
每次执行键入的Python代码之前,每次重新加载所有模块(
%aimport
排除的模块除外)。
%aimport
列出要自动导入或不导入的模块。
%aimport foo
导入模块'foo'并将其标记为
自动加载%autoreload 1
%aimport -foo
将模块'foo'标记为不自动重载。
还有dreload适用于python2和3。
dreload(module)
答案 1 :(得分:3)
这不仅适用于var contents;
function readFileData(evt) {
var file = evt.target.files[0];
var reader = new FileReader();
reader.onload = function(e) {
contents = e.target.result;
}
reader.readAsText(file);
reader.onloadend=function(e) {
console.log(contents)
}
}
document.getElementById('file').addEventListener('change', readFileData, false);
,但ipython
通常会在模块首次导入Python
时对其进行缓存。因此,在第一次导入后,每当您尝试导入它时,您都会从sys.modules
获取缓存的模块对象。
要让Python重新加载模块对象而不必重新启动Python,以便反映对模块所做的更改,您应该使用reload()
built-in function (Python 2.x)或importlib.reload()
(Python 3.x)。
Python 2.x -
sys.modules
示例 -
<module> = reload(<module>)
Python 3.x -
import module
module = reload(module) #This requires the module as it is, not a string.
与上面的import importlib
<module> = importlib.reload(<module>)
示例类似,只需使用Python 2.x
代替importlib.reload()
答案 2 :(得分:0)
当您终止IPython笔记本服务器并重新启动它时,您将拥有一个新的内核实例,该实例不会与您的笔记本本身持续存在。 您应该在打开笔记本后立即开始工作流程,方法是运行所有单元格。在顶部菜单中,选择“Cell-&gt;全部运行”