J'ai essayé de décoller certains dictionnaires de la base de données. Je suis retourné à l'utilisation du module marshal, mais je me demandais toujours pourquoi le pickle avait du mal à désérialiser certaines données. Voici une ligne de commande montrant session de python essentiellement ce que je suis en train de faire:Python pickle semble rompre à l'intérieur de la classe, mais pas dans le script de la ligne de commande
>>> a = {'service': 'amazon', 'protocol': 'stream', 'key': 'lajdfoau09424jojf.flv'}
>>> import pickle; import base64
>>> pickled = base64.b64encode(pickle.dumps(a))
>>> pickled
'KGRwMApTJ3Byb3RvY29sJwpwMQpTJ3N0cmVhbScKcDIKc1Mna2V5JwpwMwpTJ2xhamRmb2F1MDk0MjRqb2pmLmZsdicKcDQKc1Mnc2VydmljZScKcDUKUydhbWF6b24nCnA2CnMu'
>>> unpickled = pickle.loads(base64.b64decode(pickled))
>>> unpickled
{'protocol': 'stream', 'service': 'amazon', 'key': 'lajdfoau09424jojf.flv'}
>>> unpickled['service']
'amazon'
Cela fonctionne très bien, mais quand j'essaie ceci à l'intérieur d'une méthode de fabrication pour une classe, il semble que la partie de pickle.loads erreurs sur. Les cordes que j'essaie de charger sont marinés de la même manière que ci-dessus. J'ai même essayé de copier la chaîne exacte qui est décapée dans la session de ligne de commande ci-dessus et j'essaie juste de la décoder, mais sans succès. Voici le code de cette dernière tentative:
class Resource:
_service = 'unknown'
_protocol = 'unknown'
_key = 'unknown'
'''
Factory method that creates an appropriate instance of one of Resource’s subclasses based on
the type of data provided (the data being a serialized dictionary with at least the keys 'service',
'protocol', and 'key').
@param resource_data (string) -- the data used to create the new Resource instance.
'''
@staticmethod
def resource_factory(resource_data):
# Unpack the raw resource data and then create the appropriate Resource instance and return.
resource_data = "KGRwMApTJ3Byb3RvY29sJwpwMQpTJ3N0cmVhbScKcDIKc1Mna2V5JwpwMwpTJ2xhamRmb2F1MDk0MjRqb2pmLmZsdicKcDQKc1Mnc2VydmljZScKcDUKUydhbWF6b24nCnA2CnMu" #hack to just see if we can unpickle this string
logging.debug("Creating resource: " + resource_data)
unencoded = base64.b64decode(resource_data)
logging.debug("Unencoded is: " + unencoded)
unpacked = pickle.loads(unencoded)
logging.debug("Unpacked: " + unpacked)
service = unpacked['service']
protocol = unpacked['protocol']
key = unpacked['key']
if (service == 'amazon'):
return AmazonResource(service=service, protocol=protocol, key=key)
elif (service == 'fs'):
return FSResource(service=service, protocol=protocol, key=key)
Je cours cela sous un environnement django en utilisant apache mod_wsgi. Peut-être y a-t-il un problème avec cela? C'est vraiment étrange car la session shell ci-dessus se fait dans le même environnement django (shell python manage.py). Le problème se produit lorsque vous essayez d'effectuer les recherches à partir de la base de données (j'utilise la classe Resource pour piloter un champ de modèle spécial dans Django qui lit à partir d'une colonne db où les données sérialisées sont conservées). – Faisal