我试图在网络驱动器之间移动多个大文件夹(> 10 Gb,> 100个子文件夹,> 2000个文件)。我已经尝试在python中使用shutil.copytree命令工作正常,但由于不同的原因它无法复制一小部分(<1%的文件)。
我相信robocopy对我来说是最好的选择,因为我可以创建一个记录传输过程的日志文件。但是,因为我需要复制> 1000个文件夹手动工作是不可能的。
所以我的问题基本上是如何在python脚本中调用robocopy(即命令行),确保日志文件是在外部文件中写入的。
我正在开发一个Windows 7环境,由于组织限制,Linux / Unix是不可能的。如果有人有任何其他建议批量复制这么多文件夹具有很大的灵活性,欢迎他们。
Subproccess允许您进行系统调用。这将允许您像在命令行中那样调用robocopy。
from subprocess import call
call(["robocopy", "basefolder newfolder /S /LOG:mylogfile"])
使用os.exec
系列函数之一启动任何外部程序:
可能你想要os.execlp(file, arg0, arg1, ...)
就像halfs13说使用子进程但你可能需要像这样格式化它
from subprocess import call
call(["robocopy",'fromdir', 'todir',"/S"])
否则它可能会将源视为一切
这让我走上正确的道路,但我不得不用逗号分隔选项,例如
from subprocess import call
call(["robocopy", "./", "newfolder/test02", "/S", "/LOG:mylogfile"])
这是一种享受。 “/ S”复制了所有子文件夹。
cmd = 'robocopy.exe {0} {1} /S'.format(srcDir, destPath)
output = subprocess.run(cmd.split(), capture_output=True, text=True)
print(output.stdout)
上面的代码片段就是这么做的。
注意:如果srcDir
和destPath
中有任何空格,那么cmd.split()
将无效。相反,您需要执行以下操作:
output = subprocess.run(['robocopy.exe',
r'<full src path>',
r'<full dest path>',
'/S'],
capture_output=True,
text=True)
print(output.stdout)
你可以在这里阅读有关子进程的所有内容:https://docs.python.org/3.7/library/subprocess.html