2012-08-06 22 views
16

shutil.copy() está criando a un error de permisos:¿Por qué shutil.copy() levanta una excepción de permiso cuando cp no lo hace?

Traceback (most recent call last): 
    File "copy-test.py", line 3, in <module> 
    shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images') 
    File "/usr/lib/python2.7/shutil.py", line 118, in copy 
    copymode(src, dst) 
    File "/usr/lib/python2.7/shutil.py", line 91, in copymode 
    os.chmod(dst, mode) 
OSError: [Errno 1] Operation not permitted: 'bin/styles/blacktie/images/ajax-loader-000000-e3e3e3.gif' 

copy-test.py:

import shutil 

shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images') 

Me postulo copy-test.py desde la línea de comandos:

python copy-test.py 

Pero ejecutar cp desde la línea de comandos en el mismo archivo al mismo destino no causa un error. ¿Por qué?

+0

Podría, por favor escribir de la manera de empezar el guión y tal vez el código fuente de copy-test.py? –

Respuesta

30

La operación que está fallando es chmod, no la propia copia:

File "/usr/lib/python2.7/shutil.py", line 91, in copymode 
    os.chmod(dst, mode) 
OSError: [Errno 1] Operation not permitted: 'bin/styles/blacktie/images/ajax-loader-000000-e3e3e3.gif' 

Esto indica que el archivo ya existe y es propiedad de otro usuario .

shutil.copy se especifica para copiar bits de permiso. Si solo desea copiar el contenido del archivo, use shutil.copyfile(src, dst) o shutil.copyfile(src, os.path.join(dst, os.path.basename(src))) si dst es un directorio.

Una función que trabaja con dst un archivo o un directorio y no copia los bits de permiso:

def copy(src, dst): 
    if os.path.isdir(dst): 
     dst = os.path.join(dst, os.path.basename(src)) 
    shutil.copyfile(src, dst) 
+1

¿Por qué necesita chmod it? Tengo permisos de escritura y solo quiero actualizar el archivo si existe. ¿Tengo que borrar el archivo primero? Eso sería cojo. –

+0

@JustinY puede usar 'shutil.copyfile'; véase más arriba. – ecatmur

0

Esta es una especie de una suposición, pero el primero que le viene hacia mí:

'bin/styles/blacktie/images' 

Usted no tienen barra final. Si bien no estoy seguro de la implementación de shutil.copy(), puedo decirle que cp actuará de manera diferente según el sistema operativo en el que lo esté ejecutando. Lo más probable es que en su sistema, cp esté siendo inteligente y advierta que images es un directorio y está copiando el archivo en él.

Sin embargo, sin la barra final, shutil.copy() pueden interpretarlo como un archivo, no de cheques, y lanzar la excepción cuando es incapaz de crear un archivo llamado images.

En resumen, intente esto:

'bin/styles/blacktie/images/' 
+0

Buena suposición, pero agregar la barra al final no resolvió mi problema. –

0

Los argumentos deben ser:

shutil.copy('src/images/ajax-loader-000000-e3e3e3.gif', 'bin/styles/blacktie/images.ajax-loader-000000-e3e3e3.gif') 
Cuestiones relacionadas