web-dev-qa-db-fra.com

Pourquoi shutil.copy () lève-t-il une exception de permission lorsque cp ne le fait pas?

shutil.copy () soulève une erreur de permissions:

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

J'utilise copy-test.py à partir de la ligne de commande:

python copy-test.py

Mais exécuter cp à partir de la ligne de commande sur le même fichier vers la même destination ne provoque pas d'erreur. Pourquoi?

21
user879121

L'opération qui échoue est chmod, pas la copie elle-même:

  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'

Cela indique que le fichier existe déjà et appartient à un autre utilisateur.

shutil.copy est spécifié pour copier les bits d'autorisation. Si vous souhaitez uniquement copier le contenu du fichier, utilisez shutil.copyfile(src, dst) ou shutil.copyfile(src, os.path.join(dst, os.path.basename(src))) si dst est un répertoire.

Une fonction qui fonctionne avec dst soit un fichier, soit un répertoire et ne copie pas les bits d'autorisation:

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

Les arguments doivent être:

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

C'est une sorte de conjecture, mais la première chose qui me frappe:

'bin/styles/blacktie/images'

Vous n'avez pas de slash final. Bien que je ne sois pas sûr de la mise en œuvre de shutil.copy(), je peux vous dire que cp agira différemment selon le système d'exploitation sur lequel vous l'exécutez. Très probablement, sur votre système, cp est intelligent, remarquant que images est un répertoire et y copiant le fichier.

Cependant, sans la barre oblique finale, shutil.copy() peut l’interpréter comme un fichier, not checking et déclencher l’exception s’il est impossible de créer un fichier nommé images.

En bref, essayez ceci:

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