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

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

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

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

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

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

有什么想法吗?或者我应该从 1-3 中选择一个?

汉努

有帮助吗?

解决方案

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

如果我知道目标是一个文件系统 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

其他提示

使用 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),其中没有路径考虑(相对/绝对) 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top