4

我需要一个shutil模块的替代品,特别是shutil.copyfile。

这是一个鲜为人知的 py2exe 错误,它使整个 shutil 模块无用。

4

3 回答 3

3

os.system("cp file1 file2") ?

我不确定为什么 shutil 在 py2exe 中不起作用……您可能必须明确告诉 py2exe 包含该库……

于 2012-10-24T04:14:43.737 回答
2

使用 os.system() 会有很多问题;例如,当文件名中有空格或 Unicode 时。相对于异常/失败,它也将更加不透明。

如果这是在 Windows 上,使用 win32file.CopyFile() 可能是最好的方法,因为这将产生相对于原始文件的正确文件属性、日期、权限等(也就是说,它将更类似于结果您可以使用资源管理器复制文件)。

于 2013-05-15T17:08:04.997 回答
1

如果一个简单的呼叫os.system()对您有用,那么请使用该解决方案。这只是一行代码!

如果你真的想要 shutil.copyfile 之类的东西,你可以从 Python 源代码中获取你需要的东西。这是来自 Python-2.7.3/Lib/shutil.py 的相关代码:

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

def _samefile(src, dst):
    # Macintosh, Unix.
    if hasattr(os.path, 'samefile'):
        try:
            return os.path.samefile(src, dst)
        except OSError:
            return False

    # All other platforms: check for same pathname.
    return (os.path.normcase(os.path.abspath(src)) ==
            os.path.normcase(os.path.abspath(dst)))

def copyfile(src, dst):
    """Copy data from src to dst"""
    if _samefile(src, dst):
        raise Error("`%s` and `%s` are the same file" % (src, dst))

    for fn in [src, dst]:
        try:
            st = os.stat(fn)
        except OSError:
            # File most likely does not exist
            pass
        else:
            # XXX What about other special files? (sockets, devices...)
            if stat.S_ISFIFO(st.st_mode):
                raise SpecialFileError("`%s` is a named pipe" % fn)

    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fds

如果您不介意忽略所有错误检查,您可以将其提炼为:

def copyfile(src, dst):
    length = 16 * 1024
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            while True:
                buf = fsrc.read(length)
                if not buf:
                    break
                fdst.write(buf)
于 2012-10-24T05:03:51.837 回答