2

我在 IPython 中做了很多开发

In[3]: from mystuff import MyObject

然后我在 mystuff.py 中做了很多修改。为了更新命名空间,我必须这样做

In[4]: reload(mystuff)
In[5]: from mystuff import MyObject

有一个更好的方法吗?请注意,我不能通过直接引用 mystuff 来导入 MyObject

In[6]: import mystuff
In[7]: mystuff.MyObject

因为这不是它在代码中的工作方式。更好的是让 IPython在我编写文件时自动执行此操作(但这可能是另一个问题)。

任何帮助表示赞赏。

4

3 回答 3

3

您可以使用deep_reloadIPython 的功能来执行此操作。

http://ipython.scipy.org/doc/manual/html/interactive/reference.html?highlight=dreload

如果你用-deep_reload参数运行 ipython 来替换普通reload()方法。

如果这不能满足您的要求,则可以编写一个脚本来自动替换作用域中的所有导入模块。虽然相当hacky,但它应该工作;)

我刚刚找到了这个ipy_autoreload模块。也许这可以帮助你一点。我还不确定它是如何工作的,但这应该根据文档工作:

import ipy_autoreload
%autoreload 1
于 2010-07-21T19:24:51.113 回答
0

如果对象是类或函数,则可以使用其__module__属性来确定要重新加载哪个模块:

def reload_for(obj):
    module = reload(__import__(obj.__module__, fromlist=True))
    return getattr(module, obj.__name__)

MyClass = reload_for(MyClass)
于 2010-07-21T19:22:55.527 回答
0

尝试使用 %run 魔法来导入您正在编辑的文件的内容。当您使用它从文件中导入对象时,它会在您每次运行时更新这些对象。这样,每次回车时都不会自动重新加载。

于 2014-11-13T17:44:05.943 回答