shelve(python)真的很奇怪的问题

Jes*_*dge 5 python shelve

我创建了一个名为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")
Run Code Online (Sandbox Code Playgroud)

在该文件旁边,我创建了一个名为foo_packagethan 的目录,其中包含一个空__init__.py文件和一个名为g.pyjust 的文件:

class g:
    pass
Run Code Online (Sandbox Code Playgroud)

现在,当我运行时,foo_module.py我得到一个奇怪的错误消息:

Exception TypeError: "'NoneType' object is not callable" in ignored

但是,如果我将目录重命名foo_packagefoo,并更改导入行foo_module.py,我不会收到任何错误.Wtf在这里发生了什么?

在WinXP上运行Python 2.6.4.

Ale*_*lli 10

我认为你在2.6.4的程序结束时与清理相关的代码中遇到了一个小错误.如果你运行,python -v你可以确切地看到错误来自清理的哪一点:

# cleanup[1] foo_package.g
Exception TypeError: "'NoneType' object is not callable" in  ignored
Run Code Online (Sandbox Code Playgroud)

Python None在程序结束时的清理期间设置引用,看起来它对于状态的混淆g.shelf.作为一种解决方法,你可以g.shelf = None在之后设置close.我还建议在Python的bug跟踪器中打开一个bug!

  • 解决方法有效,谢谢.这是错误报告:http://bugs.python.org/issue7835 (2认同)

Ree*_*ece 10

经过几天的脱发后,我终于使用atexit功能取得了成功:

  import atexit
  ...
  cache = shelve.open(path)
  atexit.register(cache.close)
Run Code Online (Sandbox Code Playgroud)

打开后立即注册是最合适的.这适用于多个并发架子.

(关于清晰的python 2.6.5)