1

我正在尝试在网络驱动器之间移动多个大文件夹(> 10 Gb、> 100 个子文件夹、> 2000 个文件)。我曾尝试在 python 中使用 shutil.copytree 命令,该命令工作正常,但由于不同原因它无法复制一小部分(< 1 % of files )。

我相信 robocopy 对我来说是最好的选择,因为我可以创建一个记录传输过程的日志文件。但是,由于我需要复制 > 1000 个文件夹,因此手动工作是不可能的。

所以我的问题本质上是如何从python脚本中调用robocopy(即命令行),确保日志文件写入外部文件。

我在 Windows 7 环境中工作,由于组织限制,Linux/Unix 是不可能的。如果有人有任何其他建议可以灵活地批量复制这么多文件夹,欢迎他们。

4

5 回答 5

9

子进程允许您进行系统调用。这将允许您像从命令行一样调用 robocopy。

from subprocess import call
call(["robocopy", "basefolder newfolder /S /LOG:mylogfile"])
于 2012-10-31T15:54:50.823 回答
4

就像 halfs13 说的那样使用 subprocess 但你可能需要像这样格式化它

from subprocess import call call(["robocopy",'fromdir', 'todir',"/S"]) 否则它可能会将源代码读取为一切

于 2014-10-06T18:14:14.200 回答
1

使用os.exec一系列函数之一来启动任何外部程序:

可能你想要os.execlp(file, arg0, arg1, ...)

于 2012-10-31T15:51:52.470 回答
1

这让我走上了正确的道路,但我不得不用逗号分隔选项,例如

from subprocess import call
call(["robocopy", "./", "newfolder/test02", "/S", "/LOG:mylogfile"])

这是一种享受。“/S”复制了所有子文件夹。

于 2017-12-11T21:16:42.293 回答
0
cmd = 'robocopy.exe {0} {1} /S'.format(srcDir, destPath)
output = subprocess.run(cmd.split(), capture_output=True, text=True)
print(output.stdout)

上面的代码片段会做到这一点。

注意:如果srcDirdestPath中有任何空格,则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

于 2019-03-28T06:31:28.320 回答