题
我创建一个名为 foo_module.py
包含以下代码:
import shelve, whichdb, os
from foo_package.g import g
g.shelf = shelve.open("foo_path")
g.shelf.close()
print whichdb.whichdb("foo_path") # => dbhash
os.remove("foo_path")
在该文件旁边,我创建一个名为的目录 foo_package
比包含一个空 __init__.py
文件和一个名为 g.py
只包含:
class g:
pass
现在当我跑步时 foo_module.py
我收到一条奇怪的错误消息:
Exception TypeError: "'NoneType' object is not callable" in ignored
但是,如果我将目录重命名为 foo_package
到 foo
, ,并更改导入行 foo_module.py
, ,我没有收到任何错误。这是怎么回事?
在 WinXP 上运行 Python 2.6.4。
解决方案
我想你已经打了一个小错误在2.6.4的在程序结束相关的清理代码。如果您运行python -v
您可以在清理的哪一点看完全错误出现:
# cleanup[1] foo_package.g
Exception TypeError: "'NoneType' object is not callable" in ignored
在的Python程序结束清理期间设置为None
引用,它看起来像它弄不清g.shelf
的状态。作为一种变通方法,你可以在g.shelf = None
后置close
。我还建议在Python的bug跟踪系统打开了一个bug!
其他提示
在脱发的日子里,我使用的atexit函数终于成功:
import atexit
...
cache = shelve.open(path)
atexit.register(cache.close)
它打开后立即进行登记是最合适的。这适用于多个并发的货架上。
(2.6.5蟒上清晰)
这的确是一个Python的错误,我已经发布了一个补丁,你打开了跟踪问题(感谢这样做)。
问题是搁置的删除方式调用它的关闭方法,但如果搁置模块已经经历过清理,关闭方法失败,您看到消息。
您可以通过g.shelf.close之后加入“德尔g.shelf”避免在你的代码的消息。只要g.shelf是到搁板的唯一引用,这将导致在CPython的调用货架的删除方式马上,解释清除阶段之前,从而避免该错误消息。
这似乎是在由shelve
模块中注册的关闭功能异常。在“忽略”部分是从关闭系统,并可能会措辞的某个时候提高,每发行6294 。我仍然希望如何消除异常本身的答案,但...
我在一个未关闭一个简单的shelve.close()
做的工作。
shelve.open(“somefile”)返回一个“持续字典用于读取和写入”对象,其我用整个应用程序的运行时。 当我终止该应用我接收到的“类型错误”异常如所提到的。 我plased一个“关闭()”呼叫我的终止序列而且似乎来解决这个问题。
e.g。 shelveObj = shelve.open( '文件名') ... shelveObj.close()
OverByThere 评论于 七月 17, 2018
简而言之,打开 /usr/lib/python3.5/weakref.py 并将第 109 行更改为:
def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref):
第 117 行至:
_atomic_removal(d, wr.key)
请注意,您需要使用空格而不是制表符来执行此操作,因为这会导致其他错误。