【问题标题】:Ipython deep_reload Exception when importing from sqlalchemy从 sqlalchemy 导入时出现 Ipython deep_reload 异常
【发布时间】:2013-06-07 16:20:20
【问题描述】:

我正在开发我的 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

然后抛出异常,这里是最近的traceback入口:

\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 时,我开始根据回溯堆栈顶部的模块(上例中的“_sqlite3”)添加排除项。

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

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

我认为这只是一些懒惰的编码终于赶上了我的一个例子。

【问题讨论】:

    标签: ipython


    【解决方案1】:

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

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

    等等

    【讨论】:

    • 为什么需要重新加载 sqlite3?
    • 我误解了您建议的确切意图,尝试您的建议使我找到了解决方案(但不是答案)。
    猜你喜欢
    • 2016-08-05
    • 2015-07-04
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多