FAT文件系统上的Python shutil.copy失败(Ubuntu)

时间:2013-11-16 15:30:00

标签: python linux mount shutil fat

问题:使用shutil.copy()将文件复制到Linux中的FAT16挂载文件系统失败(Python 2.7.x)。失败是shutil内部错误并且实际上在shutil.chmod上失败,shutil.copy似乎执行。

Shell chmod也失败了,因为FAT不支持权限。

问题:这有什么好办法吗?我知道我有几个选择,例如:

  1. 使用copyfile - 不理想,因为它需要完整路径,而不仅仅是目标目录,但可行
  2. 执行shell cp复制文件
  3. 编写不会尝试更改文件模式的自己的复制功能
  4. 在Python或FAT挂载选项中是否有解决方法?我现在通过执行mount -t vfat -o umask = 000 / dev / loop0 / mnt / foo

    将文件系统挂载到我的程序中

    捕获异常没有帮助,因为异常发生在shutil.copy中,并且shutil.copy()似乎在将目标文件从shutil.chmod()捕获IOException之前删除目标文件,然后将IOException传递给调用函数。

    任何想法,或者我应该从1-3中选择一个?

    哈努哈利

2 个答案:

答案 0 :(得分:5)

我在这种情况下作弊。

如果我知道目标是chmod失败的文件系统,我只需使用chmod从os包中删除del os.chmod方法,这样就可以使副本成功。

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

现在,您可以在chmod上执行复制而不会失败。然后我们通过返回属性重新启用它。

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

答案 1 :(得分:0)

使用shutil.copyfile,它不需要完整路径。

全局删除os.chmod 是一个好主意。

$ 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 ./

正如您在shutil(/usr/lib/python2.7/shutil.py)的python源代码中所看到的,copy源代码中没有路径考虑(相对/绝对),src变量是直接作为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)