如何在Python脚本中调用robocopy来批量复制多个文件夹?

mftmpeh8  于 7个月前  发布在  Python
关注(0)|答案(6)|浏览(96)

我试图在网络驱动器之间移动多个大文件夹(> 10 Gb,> 100个子文件夹,> 2000个文件)。我试过在python中使用shutil.copytree命令,它工作正常,只是由于不同的原因,它无法复制一小部分(<1%的文件)。
我相信robocopy对我来说是最好的选择,因为我可以创建一个记录传输过程的日志文件。但是,由于我需要复制> 1000个文件夹,手动工作是毫无疑问的。
所以我的问题本质上是我如何从Python脚本中调用robocopy(即命令行),以确保日志文件被写入外部文件。
我正在Windows 7环境下工作,由于组织限制,Linux/Unix是不可能的。如果有人有任何其他建议,可以灵活地批量复制这么多文件夹,欢迎他们。

r3i60tvu

r3i60tvu1#

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

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

字符串

k0pti3hp

k0pti3hp2#

就像halfs13说的使用子进程,但你可能需要像这样格式化它

from subprocess import call
call(["robocopy", 'fromdir', 'todir', "/S"])

字符串
否则它可能会把源代码当作一切

eaf3rand

eaf3rand3#

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

  • http://docs.python.org/2/library/os.html#process-management

您可能需要os.execlp(file, arg0, arg1, ...)

qoefvg9y

qoefvg9y4#

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

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

字符串
这一招很管用,“/S”复制了所有的字母。

pzfprimi

pzfprimi5#

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

pxy2qtax

pxy2qtax6#

谢谢昆顿·布莱克和半个13!
我最终得到了这个版本,接受空格非ASCII字符。

from subprocess import call
SOURCE="c:\\A path with spaces"
DESTINATION="c:\\Norwegian characters ÆØÅ".encode('UTF-8')
call(["robocopy", SOURCE, DESTINATION, "/S"])

字符串

相关问题