6

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

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

问题:有什么巧妙的方法可以解决这个问题吗?我知道我有几个选择,例如:

  1. 使用 copyfile - 不理想,因为它需要完整路径,不仅仅是目标目录,而是可行的
  2. 执行shell cp 复制文件
  3. 编写不尝试更改文件模式的自己的复制功能

有没有办法在 Python 或 FAT 挂载选项中解决这个问题?我现在通过执行 mount -t vfat -o umask=000 /dev/loop0 /mnt/foo 在我的程序中安装文件系统

捕获异常没有帮助,因为异常发生在 shutil.copy 内部,而当它从 shutil.chmod() 捕获 IOException 时,shutil.copy() 似乎删除了目标文件,然后将 IOException 传递给调用函数。

有什么想法,还是我应该从 1-3 中选择一个?

汉努

4

2 回答 2

5

好吧,我在这种情况下作弊。

如果我知道目标是chmod失败的文件系统,我只需使用 os 从包中删除该chmod方法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
于 2013-11-16T19:22:49.127 回答
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()的python源码中可以看到,源码/usr/lib/python2.7/shutil.py中没有路径考虑(相对/绝对)copysrc变量直接作为参数传递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)
于 2015-04-17T10:58:36.307 回答