Question

Je crée un fichier appelé foo_module.py contenant le code suivant:

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

A côté de ce fichier que je crée un répertoire appelé foo_package que contient un fichier __init__.py vide et un fichier appelé g.py qui ne contient que:

class g:
    pass

Maintenant, quand je lance foo_module.py je reçois un message d'erreur bizarre:

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

Mais alors, si je renomme le répertoire de foo_package à foo, et changer la ligne d'importation foo_module.py, je ne reçois pas d'erreur. Wtf qui se passe ici?

Running Python 2.6.4 sur Windows XP.

Était-ce utile?

La solution

Je pense que vous avez touché un bug mineur dans le code de 2.6.4 lié au nettoyage à la fin du programme. Si vous exécutez python -v vous pouvez voir exactement à quel moment du nettoyage de l'erreur est:

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

Python définit les références à None lors du nettoyage à la fin du programme, et il semble que ça devient confus au sujet de l'état de g.shelf. Pour contourner ce problème, vous pouvez définir g.shelf = None après la close. Je recommande également l'ouverture d'un bug dans le bug tracker de Python!

Autres conseils

Après des jours de perte de cheveux, j'ai finalement eu du succès en utilisant une fonction atexit:

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

Il est plus approprié d'enregistrer juste après l'ouverture. Cela fonctionne avec plusieurs tablettes concurrentes.

(python 2.6.5 sur lucide)

Ceci est en effet un bug de Python, et je l'ai publié un patch à la question de suivi que vous ouvriez (merci pour le faire).

Le problème est que de shelve del méthode appelle sa méthode proche, mais si le module shelve a déjà par le nettoyage, la méthode close échoue avec le message que vous voyez.

Vous pouvez éviter le message dans votre code en ajoutant « del g.shelf » après g.shelf.close. Tant que g.shelf est la seule référence à la plate-forme, cela se traduira par CPython appelant le droit de la shelve méthode del loin, avant la phase de nettoyage d'interprète, et éviter ainsi le message d'erreur.

Il semble être une exception dans une fonction d'arrêt enregistré par le module shelve. La partie « ignorée » est du système d'arrêt et pourrait obtenir son libellé amélioré quelque temps, par Edition 6294 . J'espère toujours une réponse sur la façon d'éliminer l'exception elle-même, mais ...

pour moi simple shelve.close() sur un un unclosed a fait le travail.

shelve.open ( « somefile ») retourne un objet « dictionnaire persistant pour la lecture et l'écriture » que j'ai utilisé tout au long de l'exécution de l'application. quand je mis fin à l'application I reçu l'Exception « TypeError » comme indiqué. Je plased un « close () » appel dans ma séquence de terminaison et qui semblait résoudre le problème.

par exemple. shelveObj = shelve.open ( 'filename') ... shelveObj.close ()

scroll top