python shell split shlex

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)

Ver bugs.python.org/issue22454


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