我将subprocess.check_call与rsync结合使用。
我需要使用来自包含多个空格分隔值的字符串的rsync参数,但是因为字符串是单个对象,所以它在subprocess.check_call中失败(它希望每个参数都是一个单独的字符串)。
这就是我所说的:
import subprocess
rsync_options = '-axh --delete --delete-excluded'
subprocess.check_call(['rsync', rsync_options, '/tmp/1', '/tmp/2'])
返回以下内容:
subprocess.CalledProcessError: Command '['rsync', '-axh --delete --delete-excluded', '/tmp/1', '/tmp/2']' returned non-zero exit status 1
这有效:
subprocess.check_call(['rsync', '-axh', '--delete', '--delete-excluded', '/tmp/1', '/tmp/2'])
如何从rsync_options生成单独的字符串并格式化它们以便在subprocess.check_call中使用,而不知道可能提供了多少个参数?
答案 0 :(得分:3)
如果我正确理解您的问题,您可以使用shlex.split
。 (正如JAB所指出的那样,rsync_options.split()
在这种特殊情况下也是一种选择,但在某些极端情况下失败,as illustrated by the note here。)
>>> import shlex
>>> shlex.split('-axh --delete --delete-excluded')
['-axh', '--delete', '--delete-excluded']
然后您可以以任何您喜欢的方式insert
,append
或extend
结果。
构建最终列表的最简单方法可能是连接:
>>> rsync_options = '-axh --delete --delete-excluded'
>>> rsync_args = ['rsync'] + shlex.split(rsync_options) + ['/tmp/1', '/tmp/2']
>>> rsync_args
['rsync', '-axh', '--delete', '--delete-excluded', '/tmp/1', '/tmp/2']
但是那会复制一份。在这种情况下,这可能无关紧要,但只是为了完整起见,这是一种不用复制就可以做到的方法:
>>> rsync_args = shlex.split(rsync_options)
>>> rsync_args.extend(['/tmp/1', '/tmp/2'])
>>> rsync_args.insert(0, 'rsync')
>>> rsync_args
['rsync', '-axh', '--delete', '--delete-excluded', '/tmp/1', '/tmp/2']