如何让ipython了解对自写模块所做的更改?

时间:2015-08-28 10:39:18

标签: python ipython

尝试自写模块时,最初几次可能会以错误结束。

但是在修复这些错误时,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糟透了。大多数时候,这意味着必须重新导入数十种内容并执行几十个命令,以便能够实际测试我目前正在进行的操作。

3 个答案:

答案 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;全部运行”