【问题标题】:How do I make ipython aware of changes made to a selfwritten module?如何让 ipython 知道对自写模块所做的更改?
【发布时间】:2015-08-28 10:39:17
【问题描述】:

尝试自写模块时,最初几次很可能以错误告终。

但是在修复这些错误时,ipython 似乎并没有注意到这一点。

是否有重新加载新模块的 ipython 命令? 'clear' 并不能解决问题。到目前为止,唯一有效的方法是“退出”并开始一个新会话。但这也意味着重做我迄今为止所做的一切。

或者我是否需要在模块中添加一些东西,它会在运行后杀死它的所有内部变量?

示例:

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 很糟糕。大多数情况下,这意味着必须重新导入几十个东西并执行几十个命令,才能真正测试我目前正在做的事情。

【问题讨论】:

标签: python ipython


【解决方案1】:

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

模块在没有显式重新加载的情况下被重新加载,并且使用 from 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)

【讨论】:

  • 谢谢,这很有帮助!但现在我更喜欢手动重新加载,如果需要的话。
  • @JC_CL, dreload 会做到这一点,dreload(module) 不需要对 python2 或 3 进行任何导入
【解决方案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()

【讨论】:

  • 如何在 2.x 中将reload 与自制模块一起使用? reload(mymodule)reload('mymodule.py')reload(readCSVts) 均以 NameError: name 'mymodule' is not definedTypeError: reload() argument must be module 失败
  • import mymodule ; reload(mymodule).
  • 我这样导入时是否也有办法使用它:from mymodule import readCSVts?我更喜欢只导入一个东西(在这种情况下为readCSVts),这样我就可以省去import mymodule as foo之类的东西,然后不得不写data = foo.readCSVts('file.csv')
  • 您必须以某种方式获取module 对象才能重新加载它,因此您可以使用import mymodule 来重新加载它。您可以同时拥有 from mymodule import &lt;something&gt;import mymodule 。就像我说的那样,模块总是只会被导入一次,所以除了在你的命名空间中有一个额外的变量之外,它不应该导致任何其他性能问题。
  • 非常有帮助!我必须多玩一点。
【解决方案3】:

当您终止 IPython 笔记本服务器并重新启动它时,您将拥有一个新的内核实例,它不会与您的笔记本本身保持一致。 您应该在打开笔记本后立即通过运行所有单元格开始您的工作流程。在顶部菜单中,选择“Cell->Run all”

【讨论】:

  • 我只是在使用“普通”的 ipython。这里没有笔记本。
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多