Problem: Using shutil.copy() to copy a file to a FAT16 mounted filesystem in Linux fails (Python 2.7.x). The failure is shutil internal error and failing actually on shutil.chmod, which shutil.copy seems to execute.
Shell chmod fails, too, as permissions are not supported in FAT.
Questions: Is there any neat way around this? I know I have several options, for example:
- Use copyfile - not ideal as it requires full path, not just target directory, but doable
- Execute shell cp to copy files
- Write own copy function that doesn't try to change file modes
Is there a way around this in Python OR in FAT mount options? I now mount the filesystem inside my program by executing mount -t vfat -o umask=000 /dev/loop0 /mnt/foo
Catching the exception doesn't help, as the exception happens inside shutil.copy and shutil.copy() seems to delete the target file when it catches IOException from shutil.chmod(), before passing IOException to the calling function.
Any ideas, or should I just choose one from 1-3?
Hannu
Use
shutil.copyfile
, it does not require full path.Deleting
os.chmod
globally is not a good idea.As you can see in the python source code of shutil (
/usr/lib/python2.7/shutil.py
), there is no path consideration (relative/absolute) in thecopy
source code, thesrc
variable is directly passed as an argument ofcopyfile
.Well I cheat in this case.
If I know that the target is a file system where
chmod
fails, I simply delete thechmod
method from the os package usingdel os.chmod
, and this allows the copy to succeed.This now allows you to perform the copy without failing on the chmod. Then we re-enable it by assigning the attribute back.