it-swarm.com.de

Warum würde shutil.copy () eine Berechtigungsausnahme auslösen, wenn cp dies nicht tut?

shutil.copy () löst einen Berechtigungsfehler aus:

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

Ich führe copy-test.py von der Kommandozeile aus:

python copy-test.py

Das Ausführen von cp von der Befehlszeile in derselben Datei zum selben Ziel verursacht jedoch keinen Fehler. Warum?

21
user879121

Die fehlgeschlagene Operation ist chmod, 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 existiert und einem anderen Benutzer gehört.

shutil.copy wird angegeben, um Berechtigungsbits zu kopieren. 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 einer Datei oder einem Verzeichnis arbeitet und Berechtigungsbits nicht kopiert:

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

Dieses Formular hat bei mir funktioniert:

shutil.copy('/src_path/filename','/dest_path/filename')
0
Mebrahtom Guesh

Argumente müssen sein:

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

Dies ist eine Art Vermutung, aber das erste, was mir auffällt:

'bin/styles/blacktie/images'

Sie haben keinen nachstehenden Schrägstrich. Obwohl ich nicht sicher bin, was die Implementierung von shutil.copy() betrifft, kann ich Ihnen sagen, dass cp je nach Betriebssystem unterschiedlich ist. Wahrscheinlich ist cp auf Ihrem System intelligent und bemerkt, dass images ein Verzeichnis ist, und kopiert die Datei in dieses Verzeichnis.

Ohne den abschließenden Schrägstrich interpretiert shutil.copy() ihn jedoch möglicherweise als Datei ( not checking) und löst die Ausnahme aus, wenn keine Datei mit dem Namen images erstellt werden kann.

Versuchen Sie es kurz:

'bin/styles/blacktie/images/'
0
Izkata