我创建了一个名为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_package为foo,并更改导入行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!
Ree*_*ece 10
经过几天的脱发后,我终于使用atexit功能取得了成功:
import atexit
...
cache = shelve.open(path)
atexit.register(cache.close)
Run Code Online (Sandbox Code Playgroud)
打开后立即注册是最合适的.这适用于多个并发架子.
(关于清晰的python 2.6.5)
| 归档时间: |
|
| 查看次数: |
4410 次 |
| 最近记录: |