Python shutil.copyfile的替代方案

Python shutil.copyfile的替代方案,python,py2exe,Python,Py2exe,我需要shutil模块的替代品,尤其是shutil.copyfile py2exe中的一个鲜为人知的错误使整个shutil模块变得无用。嗯 os.system("cp file1 file2") ? 我不知道为什么shutil不能在py2exe中工作。。。您可能必须明确地告诉py2exe包含该库…如果对os.system()的简单调用对您有效,那么就使用该解决方案。这只是一行代码 如果您确实需要类似shutil.copyfile的内容,可以从Python源代码中获取所需内容。下面是Python

我需要shutil模块的替代品,尤其是shutil.copyfile

py2exe中的一个鲜为人知的错误使整个shutil模块变得无用。

os.system("cp file1 file2") ?

我不知道为什么shutil不能在py2exe中工作。。。您可能必须明确地告诉py2exe包含该库…

如果对
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)
由于许多原因,使用os.system()会有问题;例如,当文件名中有空格或Unicode时。相对于异常/故障,它也将更加不透明


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

有什么错误?
shutil
可以很好地处理,你可以试一试。这个bug记录在这里:我不太乐意遇到这个问题,因为shutil非常有用,只要你有cygwin或mingw,并且在你的路径上有垃圾箱。。。或者使用windows等效(
copy
)如果有人正在分发exe文件,他们可能无法假定用户具有cygwin或mingw,因此我认为
copy
将是更好的选择。而16 KB的缓冲区?文件系统缓冲区通常要大得多——即使在嵌入式系统上也是如此。如果内存对我有用的话,6年前Symbian上的内存是0x80000(512 KB)。我不知道为什么shutil.copyfile默认为16KB的缓冲区。更大的缓冲区对我来说是合理的。