2010-04-22 15 views
6

Hay ocasiones en que creo automágicamente scripts de shell pequeños desde Python, y quiero asegurarme de que los argumentos de los nombres de archivo no contengan caracteres especiales no-escapados. Lancé mi propia solución, que proporcionaré como respuesta, pero estoy casi seguro de haber visto tal función perdida en algún lugar de la biblioteca estándar. Por "perdido" me refiero a que no lo encontré en un módulo obvio como shlex, cmd o subprocess.Citar Caracteres especiales de shell POSIX en la salida de Python

¿Conoces esta función en el stdlib? Si es así, ¿dónde está?

Incluso se aceptará una respuesta negativa (pero definitiva y correcta :).

+1

posible duplicado de [¿Cuál es la mejor forma de escapar de os.system() llamadas en Python?] (Http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-os- system-calls-in-python) - Aunque el otro está hablando de os.system y no es así, es la misma cita para el mismo propósito. Y tiene las mismas respuestas. –

Respuesta

6

pipes.quote():

>>> from pipes import quote 
>>> quote("""some'horrible"string\with lots of junk!$$!""") 
'"some\'horrible\\"string\\\\with lots of junk!\\$\\$!"' 

Aunque la nota que está sin duda tiene un error en el que un arg longitud cero volverá nada:

>>> quote("") 
'' 

Probablemente sería mejor si se volvió '""'.

+0

¡Sí, gracias! Y está en un módulo obvio (para un usuario POSIX), así que estaba equivocado. – tzot

+0

A veces 'subprocess.list2cmdline' también es útil; * * no escapa de los metacaracteres del shell, pero maneja el escape de citas y espacios de escape, por lo que es bastante bueno cuando * desea * invocar un shell remoto pero está pasando por una o más capas adicionales de escape en el camino, como 'ssh' invocación del comando remoto. –

1

La función que utilizo es:

def quote_filename(filename): 
    return '"%s"' % (
     filename 
     .replace('\\', '\\\\') 
     .replace('"', '\"') 
     .replace('$', '\$') 
     .replace('`', '\`') 
    ) 

que es: Siempre incluyo el nombre de archivo entre comillas dobles, y luego citar sólo los caracteres especiales entre comillas dobles.

+0

¿No es exasperante cuando haces una pregunta solo para responderla, y en primer lugar fue una estafa? : P (También me sucedió hace poco) –

+0

@Roger: Infierno. El mecanismo de búsqueda de SO necesita mejoras. I * did * busca una respuesta antes de preguntar. Tenga en cuenta que mi respuesta nunca fue pensada para ser elegida como * la * respuesta. También voté por cerrar la pregunta. – tzot

+0

[De hecho, lo hace.] (Http://meta.stackexchange.com/questions/42878/show-related-questions-just-before-question-submission) No estaba tratando de decir nada malo sobre su pregunta al pregunta (incluso puede ser difícil buscar hasta después de todos los procesos de pensamiento que entraron en escritura y publicación), simplemente tratando de compartir la frustración. –