Какая обратная сторона shlex.split?

Как можно отменить результаты shlex.split? То есть, как я могу получить строку с кавычками, которая "напоминает версию оболочки Unix" , учитывая list строк, которые я хочу процитировать

Update0

Я обнаружил ошибку Python и сделал соответствующие запросы функций здесь.

Ответ 1

Теперь мы (3.3) имеем функцию shlex.quote. Его никто другой, что pipes.quote не перемещается и не документируется (код с использованием pipes.quote будет работать). См. http://bugs.python.org/issue9723 для всего обсуждения.

subprocess.list2cmdline является частной функцией, которая не должна использоваться. Однако он мог быть перенесен на shlex и официально опубликован. См. Также http://bugs.python.org/issue1724822.

Ответ 2

Как насчет использования pipes.quote?

import pipes
strings = ["ls", "/etc/services", "file with spaces"]
" ".join(pipes.quote(s) for s in strings)
# "ls /etc/services 'file with spaces'"

.

Ответ 3

subprocess использует subprocess.list2cmdline(). Это не официальный публичный API, но он упоминается в документации subprocess, и я думаю, что он довольно безопасен в использовании. Он более сложный, чем pipes.open() (к лучшему или худшему).

Ответ 4

Существует запрос на добавление shlex.join(), который будет делать именно то, что вы просите. На данный момент, похоже, нет никакого прогресса в этом, хотя, в основном, поскольку это будет в основном только вперед к shlex.quote(). В отчете об ошибке упоминается предлагаемая реализация:

' '.join(shlex.quote(x) for x in split_command)

См https://bugs.python.org/issue22454

Ответ 5

Оба 'foo' и "'foo'" преобразуются символом shlex.split в один и тот же список:

In [44]: shlex.split("'foo'")
Out[44]: ['foo']

In [45]: shlex.split("foo")
Out[45]: ['foo']

Поэтому я не думаю, что во всех случаях можно отменить shlex.split, но this может вас закрыть:

In [20]: import subprocess
In [21]: subprocess.list2cmdline(shlex.split('prog -s "foo bar"'))
Out[21]: 'prog -s "foo bar"'

In [22]: subprocess.list2cmdline(shlex.split('prog -s "foo bar" "baz"'))
Out[22]: 'prog -s "foo bar" baz'