2012-08-06 7 views
16

shutil.copy() sta sollevando un errore di permesso:Perché shutil.copy() genera un'eccezione di autorizzazione quando cp non lo fa?

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') 

Sono in esecuzione copy-test.py dalla riga di comando:

python copy-test.py 

Ma eseguire cp dalla riga di comando sullo stesso file alla stessa destinazione non causa un errore. Perché?

+0

La prego di scrivere il modo in cui si avvia lo script e forse il codice sorgente di copy-test.py? –

risposta

30

L'operazione che sta fallendo è chmod, non è la copia di se stesso:

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' 

Questo indica che il file esiste già ed è di proprietà di un altro utente .

shutil.copy specificato per copiare i bit di autorizzazione. Se si desidera copiare il contenuto del file, utilizzare shutil.copyfile(src, dst) o shutil.copyfile(src, os.path.join(dst, os.path.basename(src))) se dst è una directory.

Una funzione che funziona con dst un file o una directory e non copia bit dei permessi:

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

Perché è necessario chmod? Ho i permessi di scrittura e voglio semplicemente aggiornare il file se esiste. Devo prima cancellare il file? Sarebbe zoppo. –

+0

@JustinY puoi usare 'shutil.copyfile'; vedi sopra. – ecatmur

0

Questa è una specie di una supposizione, ma la prima cosa che salta fuori di me:

'bin/styles/blacktie/images' 

Non avete barra finale. Mentre non sono sicuro dell'implementazione di shutil.copy(), posso dirti che cp si comporterà in modo diverso a seconda del sistema operativo su cui lo stai eseguendo. Molto probabilmente, sul tuo sistema, cp è intelligente e nota che images è una directory e copia il file al suo interno.

Tuttavia, senza la barra finale, shutil.copy() può essere interpretandolo come un file, non controllo, e sollevando l'eccezione quando è in grado di creare un file denominato images.

Insomma, provate questo:

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

Una buona ipotesi, ma l'aggiunta della barra finale non ha risolto il mio problema. –

0

argomenti devono essere:

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