Python: 分割并格式化字符串中的空格分隔值用于subprocess.check_call
我正在使用subprocess.check_call来配合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 个回答
3
如果我理解你的问题没错的话,你可以使用 shlex.split
。 (正如JAB所提到的,rsync_options.split()
在这个特定情况下也是一个选择,但在某些特殊情况下它会出问题,这里的说明就提到了这一点。)
>>> 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']