从sqlalchemy导入时Ipython deep_reload异常

时间:2013-06-07 16:20:21

标签: ipython

我正在研究我的python库的几个模块,通过IPython进行大部分测试。

无论何时我尝试重新加载(deep_reload)使用sqlalchemy的模块,重新加载都会抛出异常而无法重新加载模块(我必须启动一个新内核并重新导入)。更具体地说,是导入我的sqlalchemy声明模型的任何模块。

回溯很长,所以我现在总结一下,如果要求提供更多。


在异常之前,StdOUT读取(这只是底部):

Reloading pysqlite2
Reloading sqlalchemy.dialects.sqlite.sqlite3
Reloading sqlite3
Reloading sqlite3.dbapi2
Reloading sqlite3.datetime
Reloading sqlite3.time
Reloading sqlite3._sqlite3
Reloading _sqlite3

然后抛出异常,这是追溯的最新条目:

\pydir\lib\site-packages\sqlalchemy-0.7.9-py2.7.egg\sqlalchemy\util\_collections.pyc in __setitem__(self, object, value)
    697         if oid not in self._weakrefs:
    698             self._weakrefs[oid] = self._ref(object)
--> 699         weakref.WeakKeyDictionary.__setitem__(self, object, value)
    700 
    701     def __delitem__(self, object):

TypeError: unbound method __setitem__() must be called with WeakKeyDictionary instance as first argument (got WeakIdentityMapping instance instead)


编辑:问题更新

调用reload时,我开始根据traceback堆栈顶部的模块添加排除项(上例中的'_sqlite3')。

我发现我一直得到相同的错误,只会来自一个新模块('pysqlite2','sqlite3')。在每种情况下,回溯总是更高的SqlAlchemy,更具体地说,'sqlalchemy.orm.mapper'。

在定义我的模型orm类时,我正在定义我的orm类,并在导入时直接从模块中将它们添加到会话中。解决方案是将这几行包装在一个不应该在导入时执行的函数中。似乎要解决。

我认为这只是一些懒惰编码的案例,最终赶上了我。

1 个答案:

答案 0 :(得分:1)

您可以将sqlite3(或pysqlite2)添加到深度重新加载的排除项中:

dreload(mymod, exclude=['sys', 'os.path', '__builtin__', '__main__', 'sqlite3'])