2011-05-31 10 views
5

Duplicar posibles:
Full command line as it was typedcómo obtener la línea de comando ORIGINAL en python? con espacios, tabulaciones, etc.

sys.argv ya se analiza matriz, perder comillas dobles, dobles espacios y tal vez incluso los caracteres de tabulación (todo depende de la OS/shell, por supuesto).

¿cómo puedo acceder a la cadena original antes de analizar?

+0

Ninguna de las respuestas proporcionadas hasta ahora aborda la pregunta original: En Unix, los argumentos de la línea de comando de origianl están en sys.argv. Son lo que tienes, sin embargo, en Windows, tienes una cadena de línea de comandos, donde se espera que cada aplicación haga su propio análisis. (Al revés: lo sé). Una respuesta a esta pregunta debería sugerir cómo obtener la cadena de línea de comando original, cuando corresponda. – Arafangion

Respuesta

0

No puede hacer eso explícitamente porque así es como un shell pasa los argumentos a un programa.

0

El sys.argv es todo lo que obtuvo Python. El shell procesó la generación del nombre de archivo (globs), la expansión del parámetro (variable), las comillas y la división de palabras antes de pasar los argumentos al proceso python (en Unix; en Windows es el inicio realmente analizándolo, pero para la portabilidad, no puede confiar en ese).

Sin embargo, recuerde que las reglas de cotización de shell POSIX permiten pasar cualquier carácter que desee (excepto los bytes NUL que terminan cadenas).

Compare comenzar un proceso desde python usando subprocess.call con o sin el conjunto de argumentos shell. Con shell=False, la lista de cadenas es lo que aparece en el sys.argv en el proceso iniciado (comenzando con la ruta del script, los parámetros procesados ​​por python se eliminan) mientras que con shell=True la cadena se pasa al intérprete que lo interpreta según sus propias reglas .

+1

"El sys.argv es exactamente lo que tienes" no es cierto. El ejecutable CPython analiza la línea de comando y rellena 'sys.argv', de acuerdo con ciertas reglas. Por ejemplo 'python -c cmd':' cmd' no estará en 'sys.argv'. –

+0

@ Jan-PhilipGehrcke: Formalmente, tienes razón. Pero no creo que sea relevante aquí. Para el script, será lo que tenga (con el nombre del script expandido) y los comandos de la línea de comandos no son muy útiles debido a que es casi imposible meter Python en una sola línea. –

+1

Tiene razón, pero utilizo cada oportunidad para enfatizar que los argumentos de línea de comando están tan llenos de codificación/decodificación, interpretación y reinterpretación, y todo tipo de conversión en diferentes niveles, que realmente no me agrada una afirmación como "es exactamente lo que tienes ":-). Encontré mi voto negativo un poco demasiado duro ahora, pero no puedo eliminarlo más, lo siento. –

3

En breve, no es así.

Largo: en la línea de comandos de Unix es analizado por el programa de llamada y cuando Python comienza usted ya tiene la línea de comando analizada.

PS. En Windows es posible, pero supongo que está buscando una respuesta general.

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ ms683156% 28v = vs.85% 29.aspx – Arafangion

Cuestiones relacionadas