2009-02-17 6 views
18

J'essaie de décomposer un objet stocké en tant que blob dans une base de données MySQL. J'ai manuellement généré et stocké l'objet Achards dans la base de données, mais lorsque je tente de unpickle l'objet, je reçois le texte suivant exception plutôt cryptique:ImportError: aucun module nommé copy_reg pickle

ImportError: Aucun module nommé copy_reg

Toutes les idées pourquoi ça arrive?

Méthode de reproduction

Note: Doit faire l'étape 1 sur un PC Windows et les étapes 3 et 4 sur un PC Linux.

1) Sur un PC Windows:

file = open("test.txt", "w") 
thing = {'a': 1, 'b':2} 
cPickle.dump(thing, file) 

2) Insérez manuellement le contenu de text.txt dans le champ blob de base de données MySQL sous Linux

3) En Python en cours d'exécution sur une machine Linux, récupérer le contenu de la colonne de MySQL

4) en supposant que vous mettez le contenu de la colonne blob dans une variable appelée données, essayez ceci:

cPickle.loads(rawString) 
+0

Quelle version de python utilisez-vous? – SilentGhost

+0

C'était avec Python 2.4 –

+0

Que code ajouterait dans cette situation? –

Répondre

23

Il semble que cela puisse être dû à ma méthode d'exportation de l'objet décapé.

This bug report On peut dire que mon problème peut être résolu en exportant vers un fichier écrit en mode binaire. Je vais essayer maintenant et voir si cela résout mon problème.

MISE À JOUR: Cela fonctionne. La solution consiste à s'assurer que vous exportez votre objet décapé dans un fichier ouvert en mode binaire, même si vous utilisez le protocole par défaut 0 (communément appelé "texte")

Code correct basé sur l'exemple original en question :

file = open("test.txt", 'wb') 
thing = {'a': 1, 'b':2} 
cPickle.dump(thing, file) 
+0

Encore une fois, que montrerait exactement le code? Comment serait-il utile de cette réponse? –

+0

Si je veux juste mentionner que 'aucun module nommé copy_reg pickle' peut être aussi n'importe quel autre nom de module comme dans mon cas. Cela peut être déroutant pendant le débogage. – holzkohlengrill

12

en outre, en cours d'exécution dos2unix simplement (sous linux) sur le fichier cornichon (fenêtres créées) a résolu le problème pour moi. (N'a pas essayé la chose en mode ouvert « wb ».) Dan

3

juste une session de python interactif pour montrer que vous n'avez pas besoin de code particulier pour avoir ce problème:

faire quelque chose comme ça sur une machine windows

Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle, re 
>>> empty_string = re.compile("^$") 
>>> pickle.dump([empty_string,1,1.23,'abc'], file('m:/mario/test-b.dump','wb')) 
>>> pickle.dump([empty_string,1,1.23,'abc'], file('m:/mario/test-t.dump','wt')) 
>>> 

et puis essayer de récupérer les données à partir d'une boîte de linux

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle 
>>> pickle.load(file('/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-b.dump')) 
/usr/lib/python2.6/pickle.py:1124: DeprecationWarning: The sre module is deprecated, please import re. 
    __import__(module) 
[<_sre.SRE_Pattern object at 0xb7d42420>, 1, 1.23, 'abc'] 
>>> pickle.load(file('/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-t.dump')) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/pickle.py", line 1370, in load 
    return Unpickler(file).load() 
    File "/usr/lib/python2.6/pickle.py", line 858, in load 
    dispatch[key](self) 
    File "/usr/lib/python2.6/pickle.py", line 1090, in load_global 
    klass = self.find_class(module, name) 
    File "/usr/lib/python2.6/pickle.py", line 1124, in find_class 
    __import__(module) 
ImportError: No module named sre 
>>> 

le message d'erreur peut être encore plus confus si vous un re juste décapage des types de base. ce que je reçois la liste [12, 1.2, '']:

ValueError: insecure string pickle 
1

Une autre chose qui se passe ici est que vous ne semblez pas avoir fermé le dossier après le dumping du cornichon à elle. l'erreur signalée ici peut parfois être causée (que ce soit sur une machine Windows ou autre) en ne fermant pas le fichier.

0

Comme mentionné dans l'autre réponse utiliser

dos2unix originalPickle.file outputPickle.file 

OU utiliser la commande tr comme ci-dessous (supprime les retours chariot et ctrl-z)

tr -d '\15\32' <originalPickle.file> outputPickle.file 

ou l'utilisation awk (gawk ou nawk si son anciennes versions)

awk '{ sub("\r$", ""); print }' originalPickle.file > outputPickle.file 

O R si vous pouvez recréer un fichier pickle sous linux, utilisez-le.

0

La charge de pickle peut ne pas regarder dans le même emplacement que votre script Python. Parfois, le répertoire change en fonction de votre application. Juste avant de charger le pickle, imprimez un os.getcwd() pour trouver une solution.

Questions connexes