Pregunta

Estoy usando un IDE bruta (Microchip MPLAB) con cadena de herramientas C30 en Windows XP. El compilador de C tiene una salida muy ruidoso que yo soy incapaz de controlar, y es muy difícil de detectar avisos y errores reales en la ventana de resultados.

Quiero escribir un script en Python que recibiría argumentos a favor del compilador, llamar al compilador con los mismos argumentos, resultados de filtro y salida de ellos, a stdout . Entonces puedo reemplazar el ejecutable del compilador con mi guión en la configuración de las herramientas principales. El IDE llama mi guión y recibe salida del compilador filtrada.

Mi código para ejecutar el compilador es el siguiente:

arguments = ' '.join(sys.argv[1:])
cmd = '%s %s' % (compiler_path, arguments)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

El problema es que las cotizaciones de los argumentos que se consumen en la ejecución del script, así que si IDE llama mi guión con los siguientes argumentos:

  

main.c -o "main.o"

el valor de argumentos es

  

main.c -omain.o

La solución más obvia es poner toda la lista de argumentos entre comillas, pero esto requeriría la modificación en el compilador código de llamada en IDE. También he intentado usar archivo por lotes, pero sólo puede aceptar nueve parámetros (% 1% a 9), y el compilador se llama con más de 15 parámetros.

¿Hay una manera de reenviar exactamente los mismos argumentos a un proceso de escritura?

¿Fue útil?

Solución

Su carcasa está comiendo las comillas (el script en Python, ni siquiera los recibe), así que supongo que no es muy fácil de conseguir 'inalterada'.

Otros consejos

Dar a los argumentos de comandos a Popen como una lista:

arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Como ChristopheD dijo que la cáscara elimina las comillas.

Sin embargo, no es necesario para crear la cadena cuando utilice Popen: se puede manejar eso de forma automática. Usted puede hacer esto en su lugar:

import sys, subprocess
process = subprocess.Popen(sys.argv[1:], executable=compiler_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

El módulo de subproceso de esperar que pasar los argumentos correctamente para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top