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).