Python Shutol.Copy fallisce sui file system FAT (Ubuntu)
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:
- .
- Utilizzare CopyFile - non ideale in quanto richiede un percorso completo, non solo directory di destinazione, ma effettuabile
- Esegui shell cp per copiare i file
- Scrivi la propria funzione di copia che non prova a modificare le modalità file
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
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)
.