insecure string pickle

Jose Caballero jcaballero.hep en gmail.com
Mie Abr 2 21:36:17 CEST 2008


Hola a todos,
esta es la primera vez que hago una pregunta en esta lista. Agradezco por
adelantado vuestra atención y paciencia, y muchas gracias por la ayuda que
podáis ofrecerme.


Estoy intentando serializar un objeto mediante pickle.dumps() y pasar el
resultado como argumento a otro programa que ejecuto con
commands.getstatusoutput(  )
Paso el objeto serializado como argumento porque estoy intentado evitar, en
la medida de lo posible, hacerlo a través de un fichero intermedio.
La secuencia viene a ser como sigue:

line = pickle.dumps( object )
line = ' '.join(line.split('\n'))
line = '"%s"' % line
st, out = commands.getstatusoutput('./prog2.py %s' % line )


Las líneas segunda y tercera del ejemplo son para convertir el resultado de
dumps() en una única cadena, y que esté contenida entre dobles comillas para
evitar problemas con la shell.
El segundo programa deshace estos cambios, de la siguiente manera:


line=sys.argv[1]
line='\n'.join(line.split())
o=pickle.loads(line)


Lo he intentado con un objeto de una clase bastante simple, y funciona
perfectamente. Esto significa que la secuencia de pasos en ambos programas
es correcta.
Pero cuando lo intento con un objeto de una clase un poco más compleja
obtengo el siguiente mensaje de error:

Traceback (most recent call last):
  File "./prog2b.py", line 10, in ?
    o=pickle.loads(line)
  File "/usr/lib/python2.2/pickle.py", line 986, in loads
    return Unpickler(file).load()
  File "/usr/lib/python2.2/pickle.py", line 597, in load
    dispatch[key](self)
  File "/usr/lib/python2.2/pickle.py", line 667, in load_string
    raise ValueError, "insecure string pickle"
ValueError: insecure string pickle


Creo que puede ser porque el resultado del método dumps no es todo lo bueno
que debería. Este es, por cierto, dicho valor (antes de procesarlo):

ccopy_reg
_reconstructor
p0
(cmyproxyUtils
MyProxyInterface
p1
c__builtin__
object
p2
Ntp3
R(dp4
S'_MyProxyInterface__userDN'
p5
S'/DC=org/DC=doegrids/OU=People/CN=Jose\
Caballero\
832651'
p6
sS'_MyProxyInterface__vomsattributes'
p7
S''
p8
sS'_MyProxyInterface__servername'
p9
S'myproxy.fnal.gov'
p10
sS'_MyProxyInterface__pilotownerDN'
p11
g8
sS'_MyProxyInterface__myproxylogon_refdate'
p12
I1181620800
sS'_MyProxyInterface__proxypath'
p13
S'/tmp/ESTO_ES_UNA_PRUEBA'
p14
sS'_MyProxyInterface__pilotproxypath'
p15
S'/tmp/x509up_u10139'
p16
sS'_MyProxyInterface__command'
p17
g8
sS'_MyProxyInterface__myproxyinit_refdate'
p18
I1181620800
sbp19
.



Y éste es el resutado tras el procesamiento, y que paso como argumento al
segundo programa:

"ccopy_reg _reconstructor p0 (cmyproxyUtils MyProxyInterface p1 c__builtin__
object p2 Ntp3 R(dp4 S'_MyProxyInterface__userDN' p5
S'/DC=org/DC=doegrids/OU=People/CN=Jose\\ Caballero\\ 832651' p6
sS'_MyProxyInterface__vomsattributes' p7 S'' p8
sS'_MyProxyInterface__servername' p9 S'myproxy.fnal.gov' p10
sS'_MyProxyInterface__pilotownerDN' p11 g8
sS'_MyProxyInterface__myproxylogon_refdate' p12 I1181620800
sS'_MyProxyInterface__proxypath' p13 S'/tmp/ESTO_ES_UNA_PRUEBA' p14
sS'_MyProxyInterface__pilotproxypath' p15 S'/tmp/x509up_u10139' p16
sS'_MyProxyInterface__command' p17 g8
sS'_MyProxyInterface__myproxyinit_refdate' p18 I1181620800 sbp19 ."


¿Ven alguna cadena que pueda estar corrompida y que no sea válida para el
método loads()?
Nota, si lo hago usando un fichero intermedio, mediante los métodos dump() y
load(), todo funciona perfectamente.

Muchas gracias.
Toda ayuda que puedan ofrecerme será más que bien venida.


Saludos
Jose
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es