我在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 自动执行(但这可能是另一个问题)。
任何帮助表示感谢。
答案 0 :(得分:3)
您可以使用IPython中的deep_reload
功能执行此操作。
http://ipython.scipy.org/doc/manual/html/interactive/reference.html?highlight=dreload
如果您使用-deep_reload
参数运行ipython来替换普通的reload()
方法。
如果那样做没有你想要的,那么就可以编写一个脚本来自动替换作用域中所有导入的模块。虽然相当hacky,但它应该工作;)
我刚刚找到了ipy_autoreload
模块。也许这可以帮助你一点。我还不确定它是如何工作的,但这应该按照文档工作:
import ipy_autoreload
%autoreload 1
答案 1 :(得分:0)
如果对象是类或函数,则可以使用其__module__
属性来确定要重新加载的模块:
def reload_for(obj):
module = reload(__import__(obj.__module__, fromlist=True))
return getattr(module, obj.__name__)
MyClass = reload_for(MyClass)
答案 2 :(得分:0)
尝试使用%run magic导入正在编辑的文件的内容。当您使用它从文件导入对象时,它会在每次运行它时更新这些对象。这样,每次回程都不会自动加载。