2012-08-06 2 views
16

shutil.copy() ist ein Berechtigungsfehler erhöhen:Warum würde shutil.copy() eine Erlaubnis Ausnahme auslösen, wenn CP nicht?

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

I copy-test.py von der Kommandozeile leite:

python copy-test.py 

Aber ausgeführt cp von der Befehlszeile für die gleiche Datei an das gleiche Ziel führt nicht zu einem Fehler. Warum?

+0

Könnten Sie bitte die Art und Weise Sie das Skript starten schreiben und vielleicht Quellcode von copy-test.py? –

Antwort

30

Die Operation, die fehlschlägt chmod ist, nicht die Kopie selbst:

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' 

Dies zeigt an, dass die Datei bereits vorhanden und wird von einem anderen Benutzer gehört .

shutil.copy wird zum Kopieren von Berechtigungsbits angegeben. Wenn Sie nur den Inhalt der Datei kopieren möchten, verwenden Sie shutil.copyfile(src, dst) oder shutil.copyfile(src, os.path.join(dst, os.path.basename(src))), wenn dst ein Verzeichnis ist.

Eine Funktion, die mit dst entweder eine Datei oder ein Verzeichnis funktioniert und nicht Berechtigungs-Bits kopiert:

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

Warum muss es chmod? Ich habe Schreibrechte und möchte nur die Datei aktualisieren, wenn sie existiert. Muss ich die Datei zuerst löschen? Das wäre lahm. –

+0

@JustinY Sie können 'shuthil.copyfile' verwenden; siehe oben. – ecatmur

0

Dies ist eine Art einer Vermutung, aber das erste, was ich herausspringt:

'bin/styles/blacktie/images' 

Sie haben keinen Slash. Obwohl ich nicht sicher bin, wie die Implementierung von shutil.copy() ist, kann ich Ihnen sagen, dass cp je nach Betriebssystem, auf dem Sie es ausführen, unterschiedlich handeln wird. Höchstwahrscheinlich ist cp auf Ihrem System klug und merkt, dass images ein Verzeichnis ist, und kopiert die Datei hinein.

jedoch ohne den Schrägstrich, shutil.copy() kann es als Datei zu interpretieren, nicht Prüfung und die Erhöhung der Ausnahme, wenn es nicht in der Lage, eine Datei namens images zu erstellen.

Kurz gesagt, versuchen Sie dies:

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

Gut geraten, aber das Hinzufügen des abschließenden Schrägstrichs hat mein Problem nicht gelöst. –

0

Argumente müssen:

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