Domanda

Problema: utilizzo di navel.copy () per copiare un file su un filesystem montato FAT16 in Linux Fails (Python 2.7.x). L'errore è l'errore di arresto interno e il fallimento in realtà su navel.chmod, che si spegne.copy sembra eseguire.

Shell ChMOD non riesce anche in quanto le autorizzazioni non sono supportate in grasso.

Domande: C'è un modo ordinato attorno a questo? So che ho diverse opzioni, ad esempio:

    .
  1. Utilizzare CopyFile - non ideale in quanto richiede un percorso completo, non solo directory di destinazione, ma effettuabile
  2. Esegui shell cp per copiare i file
  3. Scrivi la propria funzione di copia che non prova a modificare le modalità file
  4. C'è un modo attorno a questo in Python o nelle opzioni di Mount Fat? Ora montano il filesystem all'interno del mio programma eseguendo Mount -t Vfat -o umask= 000 / dev / loop0 / mnt / foo

    Catturazione dell'eccezione non aiuta, poiché l'eccezione avviene all'interno di Shutol.Copy.Copy e Shutol.Copy () sembra eliminare il file di destinazione quando cattura IOException da Shutol.chmod (), prima di passare IOException alla funzione di chiamata.

    Qualche idea, o dovrei solo sceglierne uno da 1-3?

    hannu

È stato utile?

Soluzione

beh che imbroglio in questo caso.

Se so che il bersaglio è un file system in cui chmod non riesce, ho semplicemente eliminato il metodo chmod dal pacchetto OS utilizzando del os.chmod, e questo consente alla copia di avere successo.

>>> import os
>>> print hasattr(os, 'chmod')
True
>>> foo = os.chmod
>>> del os.chmod
>>> print hasattr(os, 'chmod')
False
.

Questo ora consente di eseguire la copia senza fallire sul CHMOD.Quindi lo rialiamo assegnando l'attributo indietro.

>>> setattr(os, 'chmod', foo)
>>> print hasattr(os, 'chmod')
True
.

Altri suggerimenti

Utilizzare shutil.copyfile, non richiede il percorso completo.

Eliminazione os.chmod Globally è non una buona idea.

$ mkdir folder
$ touch folder/a
$ python2.7 -c 'import shutil; shutil.copyfile("folder/a","folder/b")'
$ ls -rthla folder/
total 0
drwxr-xr-x+ Apr 17 12:49 ../
-rw-r--r--  Apr 17 12:49 a
-rw-r--r--  Apr 17 12:50 b
drwxr-xr-x+ Apr 17 12:50 ./
.

Come puoi vedere nel codice sorgente Python di Shutol (/usr/lib/python2.7/shutil.py), non vi è alcuna considerazione del percorso (relativo / assoluto) nel codice sorgente copy, la variabile src è passata direttamente come argomento di copyfile.

def copy(src, dst):
    """Copy data and mode bits ("cp src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copymode(src, dst)
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top