Python:在字符串中拆分和格式化空格分隔值,以便在subprocess.check_call中使用

时间:2011-07-25 13:17:59

标签: python string subprocess rsync

我将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中使用,而不知道可能提供了多少个参数?

1 个答案:

答案 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']

然后您可以以任何您喜欢的方式insertappendextend结果。


构建最终列表的最简单方法可能是连接:

>>> 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']