Python: разделить и отформатировать разделенные пробелом значения в строке для использования в subprocess.check_call - PullRequest
2 голосов
/ 25 июля 2011

Я использую 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 Ответ

3 голосов
/ 25 июля 2011

Если я правильно понимаю ваш вопрос, вы можете использовать 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']
...