我创建一个名为 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_packagefoo, ,并更改导入行 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)

请注意,您需要使用空格而不是制表符来执行此操作,因为这会导致其他错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top