with make how example create compress python zip zipfile

make - Establecer permisos en un archivo comprimido en python



zipfile python 3 (3)

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.

EDITAR: 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()

Esto funciona perfectamente en OS X usando 2.5.1, pero no funciona en mi Home Box (Debian, Python 2.4 y 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 forma 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

El usuario que extrae no es myuser , sino que está en mygroup .


Extraer a 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 etiquetó este ''pitón'' :-))


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.

Como no puede hacer eso, deberá intentar hacer lo que estaba tratando de hacer (y hacer que funcione en Debian).

Ha habido una serie de problemas con la biblioteca de archivos zip de Pythons, que incluyen establecer el modo de escritura en el archivo que se está escribiendo en algunos sistemas, o configurar el sistema zip en Windows en lugar de Unix. Entonces, sus resultados inconsistentes pueden significar que nada ha cambiado.

Entonces puede que no tenga suerte.


Tuve un problema similar para ti, así que aquí está el código de mi material, esto creo que 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.