Какая обратная сторона 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'
Ответ 6
Это shlex.join() в Python 3.8