probleme de synchronisation shelve

Document Actions
Réponses: 5   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

probleme de synchronisation shelve

Posté par fabella le 03/02/2010 03:45
Voici le problème. En fait, si on utilise shelve (ou d'ailleurs bsbdd ou pickle ....) tout ce passe bien lorsqu'on travaille avec la même session.
ex:
import shelve
bd=shelve.open('test')
bd['toto']='ceci est un test'
print bd['toto'] # on obtient le bon résultat

par contre faite l'exemple suivant: vous ouvrez une session avec par exemple IDLE et vous executer dans la ligne de commande:
import shelve
bd=shelve.open('test')

puis avec une session sous dos vous executer un script.py qui contient l'exemple précédent dans lequel au lieu de 'toto' vous indiquez tutu

puis une fois cette execution terminée, vous quittez la session dos et vous revenez sous votre session IDLE

dans la ligne de commande tapez maintenant
bd.has_key('TUTU') ---> 0 # surprise

Il n'y a pas de synchronisation !!!! tout ce passe en cache et je n'ai pas réussi à trouver la commande qui permet de resynchroniser le dico (bd.sync() ne fait absolument rien !!)

une IDEE GENIALE pour m'aider

Re: probleme de synchronisation shelve

Posté par benoit.intrw le 03/02/2010 09:27
Je vais peut être dire un bêtise, mais tant pis !

Le premier paramètre de open est un fichier. Comme le chemin donné n'est pas absolue, votre fichier test est crée dans le répertoire du script pour celui-ci et je ne sais pas où pour la session IDLE ...

Utiliser le code ci-dessous pourra vos aiguiller :
code:
>>> import sys
>>> print(sys.path[0])


Benoît

Re: probleme de synchronisation shelve

Posté par jacko le 03/02/2010 12:56
L'explication de benoit est judicieuse.
En voici une autre : lisez bien le 3ième paragraphe du chapitre "Restrictions" de la doc du module shelve : "The shelve module does not support....".

Re: probleme de synchronisation shelve

Posté par fabella le 18/07/2010 19:36
En fait l'explication de benoit ni celle de jacko ne conviennent. En effet, lancer deux sessions dos + python.

Utiliser bd=shelve.open(r'c:/test.txt')
dans les deux cas

vous verrez alors qu'il n'y a pas de synchronisation dans les bases !!!!

Re: probleme de synchronisation shelve

Posté par benoit.intrw le 19/07/2010 08:59
Comme souvent la réponse est dans la doc.

http://docs.python.org/library/shelve.html

En plus du paragraphe pointé pas Jacko qui précise que shelve n'est pas fait pour un accès concurrent en lecture écriture, la première note de cette page précise :

Note : Do not rely on the shelf being closed automatically; always call close() explicitly

Un appel à bd.close() écrit bel est bien les données sur le disque.

Si vous avez vraiment besoin d'accès concurrent en lecture écriture il faudrait vous tourner vers un autre module que shelve. Pourquoi pas une base de données ? D'autres pourront vous conseiller.

Benoît

Re: probleme de synchronisation shelve

Posté par fabella le 21/07/2010 08:22
merci Benoit.

Peux t'on sous python partager une mémoire commune à deux ou N process différents (ce qui permettrait dans ce cas de résoudre ce problème puisque j'accéderai au même objet) ?

François

Python.org : Le site officiel du langage Python.
Zope.org : Le site web officiel de Zope.
Daily Python-URL : Actus de l'univers Python.
Tribute to Zyons : Zyons notre ami et membre fondateur de l'Afpy, nous quittait en 2005.