Python: 分割并格式化字符串中的空格分隔值用于subprocess.check_call

2 投票
1 回答
1454 浏览
提问于 2025-04-16 22:13

我正在使用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']

撰写回答