Что обратного в shlex.split? - PullRequest
37 голосов
/ 20 января 2011

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

Update0

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

Ответы [ 4 ]

26 голосов
/ 29 июля 2011

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

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

19 голосов
/ 20 января 2011

Как насчет использования 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'"

.

6 голосов
/ 24 июля 2011

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

1 голос
/ 25 апреля 2018

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

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

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

...