2015-08-28 58 views
5

尝试使用自写模块时,最初几次可能会以错误结束。如何让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 

OK,这很容易。我在第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

您是否试过['reload'](https://docs.python.org/2/library/functions.html#reload)? – jonrsharpe

回答

2

这不仅适用于ipython,而且Python通常在第一次导入sys.modules时缓存模块。因此,在第一次导入之后,每当您尝试导入时,都会从sys.modules获得缓存模块对象。

为了让Python重新加载模块对象而不必重新启动Python,以便对模块所做的更改反映出来,您应该使用reload() built-in function (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()

+0

如何在自制模块中使用2.x中的'reload'? ''reload(mymodule)''''reload('mymodule.py')''和'reload(readCSVts)'全部失败,返回值为NameError:name'mymodule'未定义'或'TypeError:reload –

+0

做'import mymodule;重新加载(mymodule)'。 –

+0

此外,reload()需要模块对象,而不是字符串。 –

0

当你杀死IPython的笔记本电脑服务器并重新启动它,你将有一个新的内核实例不与您的笔记本电脑坚持本身。 您应该通过运行所有单元打开笔记本电脑后立即启动工作流程。在顶部的菜单中选择“细胞>运行所有”

+0

我只是在使用“普通”的ipython。这里没有笔记本。 –

4

有一个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

Reload all modules (except those excluded by %aimport) automatically now.

%autoreload 0

Disable automatic reloading.

%autoreload 1

Reload all modules imported with %aimport every time before executing the >Python code typed.

%autoreload 2

Reload all modules (except those excluded by %aimport) every time before executing the Python code typed.

%aimport

List modules which are to be automatically imported or not to be imported.

%aimport foo

Import module ‘foo’ and mark it to be autoreloaded for %autoreload 1

%aimport -foo

Mark module ‘foo’ to not be autoreloaded.

还有dreload这将为python2工作,3

dreload(module) 
+0

谢谢,这非常有帮助!但现在,如果需要,我更愿意手动重新加载。 –

+1

@JC_CL,'dreload'可以做到这一点,'dreload(module)'不需要为python2或3进行任何导入 –

相关问题