python - ¿Cuál es el reverso de shlex.split?
shell (5)
¿Qué hay de usar 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''"
.
¿Cómo puedo revertir los resultados de un shlex.split
? Es decir, ¿cómo puedo obtener una cadena entrecomillada que "se asemejaría a la de un shell de Unix" , dada una list
de cadenas que deseo citar?
Update0
Localice un error de Python e hice las solicitudes de funciones correspondientes here .
Ahora (3.3) tenemos una función shlex.quote . No es otro que pipes.quote
movido y documentado (el código que usa pipes.quote
seguirá funcionando). Ver here para la discusión completa.
subprocess.list2cmdline
es una función privada que no se debe usar. Sin embargo, podría moverse a shlex
y hacerse público oficialmente. Ver también http://bugs.python.org/issue1724822 .
Hay una solicitud de función para agregar shlex.join()
, que haría exactamente lo que usted solicite. A partir de ahora, no parece haber ningún progreso en ello, principalmente, ya que principalmente se reenvía a shlex.quote()
. En el informe de error, se menciona una implementación sugerida:
'' ''.join(shlex.quote(x) for x in split_command)
Tanto ''foo''
como "''foo''"
son transformados por shlex.split
en la misma lista:
In [44]: shlex.split("''foo''")
Out[44]: [''foo'']
In [45]: shlex.split("foo")
Out[45]: [''foo'']
Así que no creo que sea posible revertir shlex.split
en todos los casos, pero this podría shlex.split
:
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''
subprocess
usa subprocess.list2cmdline()
. No es una API pública oficial, pero se menciona en la documentación del subprocess
y creo que es bastante seguro de usar. Es más sofisticado que pipes.open()
(para bien o para mal).