2008-11-11 12 views
7

Tengo un archivo test.txt que está dentro de un archivo zip test.zip. Los permisos en test.txt están fuera de mi control cuando está comprimido, pero ahora quiero que sean de escritura grupal. Estoy extrayendo el archivo con Python, y no quiero escapar al shell.Establecer permisos en un archivo comprimido en python

EDIT: Esto es lo que tengo hasta ahora:

import zipfile 

z = zipfile.ZipFile('test.zip', 'w') 
zi = zipfile.ZipInfo('test.txt') 
zi.external_attr = 0777 << 16L 
z.writestr(zi, 'FOO') 
z.close() 

z = zipfile.ZipFile('test.zip', 'r') 
for name in z.namelist(): 
    newFile = open(name, "wb") 
    newFile.write(z.read(name)) 

    newFile.close() 
z.close() 

Esta aplicación funciona perfectamente en OS X usando 2.5.1, pero no funciona en mi cuadro de casa (Debian, Python 2.4 & 2.5) o en RHEL 5 con Python 2.4. En cualquier cosa que no sea OS X, no genera errores, pero tampoco cambia los permisos. ¿Alguna idea de por qué? Además, ¿cómo funciona writestr()? Sé que lo estoy usando incorrectamente aquí.

¿Hay alguna manera de hacerlo sin os.chmod (el usuario que extrae el archivo no tiene permisos para usar os.chmod después de extraerlo)? Tengo acceso de escritura completo al archivo zip.

Más información:

> ls -l test.zip 
-rwxrwxrwx 1 myuser mygroup 2008-11-11 13:24 test.zip 
> unzip test.zip 
Archive: test.zip 
    inflating: test.txt 
> ls -l test.txt 
-rw-r--r-- 1 myuser mygroup 2008-11-11 13:34 test.txt 

La extracción usuario no es myuser, pero es en mygroup.

+0

La otra cosa que podría hacer es explicar sus problemas en Linux, ya que alguien aquí puede ayudar, pero no ha dado nada para continuar. –

+0

No estoy seguro de lo que quiere decir. Linux se comporta bien, aunque python se comporta de manera diferente en OS X. –

+0

Bueno, dijiste "funciona en OS X, no en Debian". Si dijiste por qué no funciona, tal vez publicó algunos códigos o mensajes de error, alguien podría ayudar. Solo un pensamiento. –

Respuesta

1

Según la documentación, descomprimir establece los permisos a los almacenados, bajo Unix. Además, el shell umask no se usa. Su mejor apuesta es asegurarse de que las permanentes estén establecidas antes de comprimir el archivo.

Puesto que usted no puede hacer eso, usted tendrá que tratar de hacer lo que estaba tratando de hacer (y conseguir que funcione en Debian.)

Ha habido una serie de problemas con la biblioteca de pitones ZipFile , incluida la configuración del modo de escritura al del archivo que se está escribiendo en algunos sistemas, o la configuración del sistema zip en Windows en lugar de Unix. Entonces, sus resultados inconsistentes pueden significar que nada ha cambiado.

Así que puede que no tenga suerte.

0

¿Extracto de stdout (descomprimir -p) y redirigir a un archivo? Si hay más de un archivo en el archivo comprimido, podría enumerar el contenido del archivo comprimido y luego extraer uno a la vez.

for n in `unzip -l test.zip | awk 'NR > 3 && NF == 4 { print $4 }'`; do unzip -p test.zip $n > $n; done 

(sí, sé que este etiquetado :-) 'Python')

4

tuve un problema similar al que, por lo que aquí es la espineta código de mis cosas, yo creo que esto debería ayudar aquí .

# extract all of the zip 
for file in zf.filelist: 
    name = file.filename 
    perm = ((file.external_attr >> 16L) & 0777) 
    if name.endswith('/'): 
     outfile = os.path.join(dir, name) 
     os.mkdir(outfile, perm) 
    else: 
     outfile = os.path.join(dir, name) 
     fh = os.open(outfile, os.O_CREAT | os.O_WRONLY , perm) 
     os.write(fh, zf.read(name)) 
     os.close(fh) 
    print "Extracting: " + outfile 

Puede hacer algo similar, pero inserte su propia lógica para calcular su valor de permanente. Debo señalar que estoy usando Python 2.5 aquí, soy consciente de algunas incompatibilidades con algunas versiones del soporte de archivos zip de Python.

Cuestiones relacionadas