Frage

Ich erstelle eine Datei namens foo_module.py mit dem folgenden code:

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")

Neben, die Datei, die ich erstellen Sie ein Verzeichnis namens foo_package als enthält einen leeren __init__.py Datei und eine Datei namens g.py dass gerade enthält:

class g:
    pass

Wenn ich jetzt ausführen foo_module.py Ich bekomme eine seltsame Fehlermeldung:

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

Aber dann, wenn ich das Verzeichnis umbenennen von foo_package zu foo, und ändern Sie die import-Zeile in foo_module.py, Ich bekomme keine Fehler.Wtf ist hier Los?

Ausführen von Python-2.6.4 auf WinXP.

War es hilfreich?

Lösung

Ich glaube, Sie getroffen habe einen kleinen Fehler in 2.6.4 der code für die Bereinigung am Ende des Programms.Wenn Sie python -v Sie können genau sehen, an welchem Punkt der Aufräumarbeiten kommt der Fehler:

# cleanup[1] foo_package.g
Exception TypeError: "'NoneType' object is not callable" in  ignored

Python-legt Verweise auf None während die Aufräumarbeiten am Ende der Programm, und es sieht immer verwirrt über den status g.shelf.Als Problemumgehung können Sie g.shelf = None nach der close.Ich würde auch empfehlen, öffnen Sie einen Fehler in Python bug tracker!

Andere Tipps

Nach Tagen des Haarausfalls, ich Erfolg schließlich hatte eine atexit Funktion:

  import atexit
  ...
  cache = shelve.open(path)
  atexit.register(cache.close)

Es ist am besten geeignet Recht nach dem Öffnen zu registrieren. Dies funktioniert mit mehreren gleichzeitigen Regalen.

(Python 2.6.5 auf luzide)

Dies ist in der Tat ein Python-Fehler, und ich habe einen Patch an den Tracker Ausgang Sie geöffnet (danke für das zu tun).

Das Problem ist, dass shelve del Methode ruft ihre enge Methode, aber wenn das shelve Modul bereits durch Bereinigung wird, schlägt die close-Methode mit der Nachricht, die Sie sehen.

Sie können die Nachricht in Ihrem Code vermeiden durch Zugabe von ‚del g.shelf‘ nach g.shelf.close. Solange g.shelf der einzige Hinweis auf das Regal ist, wird dies in CPython führen die des shelve Aufruf del Methode direkt vor dem Dolmetscher Bereinigungsphase und damit die Fehlermeldung vermeiden.

Es scheint eine Ausnahme in einer Abschaltfunktion vom shelve Modul registriert zu sein. Der „ignorierte“ Teil ist aus dem Shutdown-System und könnte seine Formulierung irgendwann verbessert bekommen, pro Ausgabe 6294 . Ich hoffe immer noch auf eine Antwort, wie die Ausnahme selbst zu beseitigen, obwohl ...

für mich ein einfaches shelve.close() auf einem nicht geschlossen man den Job.

shelve.open ( ‚somefile‘) gibt einen „persistent Wörterbuch für das Lesen und Schreiben“ Objekt, das ich während der App-Laufzeit verwendet. wenn ich die App beendet erhielt ich die „Typeerror“ Exception wie erwähnt. Ich plased eine ‚close ()‘ Anruf in meiner Terminierungssequenz und das schien das Problem zu beheben.

z. shelveObj = shelve.open ( 'Dateiname') ... shelveObj.close ()

scroll top