我需要替代shutil模块,特别是shutil.copyfile。
这是一个鲜为人知的py2exe错误,它使整个shutil模块无法使用。
答案 0 :(得分:3)
嗯
os.system("cp file1 file2") ?
我不确定为什么shutil在py2exe中不起作用...你可能必须明确地告诉py2exe包含那个库......
答案 1 :(得分: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)
答案 2 :(得分:1)
出于多种原因,使用os.system()会有问题;例如,当文件名中包含空格或Unicode时。相对于异常/失败,它也会更不透明。
如果这是在Windows上,使用win32file.CopyFile()可能是最好的方法,因为这将产生相对于原始文件的正确文件属性,日期,权限等(也就是说,它会更相似通过使用资源管理器复制文件得到的结果。