Вопрос

Я использую сырую IDE (Microchip MPLAB) с набором инструментов C30 в Windows XP.Компилятор C выдает очень шумный вывод, который я не могу контролировать, и очень трудно обнаружить фактические предупреждения и ошибки в окне вывода.

Я хочу написать скрипт Python, который будет получать аргументы для компилятора, вызывать компилятор с теми же аргументами, фильтровать результаты и выводить их в стандартный вывод.Затем я могу заменить исполняемый файл компилятора своим скриптом в настройках набора инструментов.IDE вызывает мой сценарий и получает отфильтрованный вывод компилятора.

Мой код для выполнения компилятора выглядит так:

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

Проблема в том, что кавычки аргументов используются при выполнении скрипта, поэтому, если IDE вызывает мой скрипт со следующими аргументами:

main.c -o"main.o"

значение аргументы является

main.c -omain.o

Наиболее очевидное решение — заключить весь список аргументов в кавычки, но это потребует изменения кода вызова компилятора в IDE.Я также пробовал использовать пакетный файл, но он может принимать только девять параметров (от %1 до %9), а компилятор вызывается с более чем 15 параметрами.

Есть ли способ передать точно такие же аргументы процессу из сценария?

Это было полезно?

Решение

Ваша оболочка поглощает кавычки (сценарий Python даже не получает их), поэтому я полагаю, что получить их «без изменений» не так-то просто.

Другие советы

Передайте аргументы команды Popen в виде списка:

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

Как сказал ChristopheD, оболочка удаляет кавычки.

Но вам не нужно создавать строку самостоятельно при использовании Popen:он может сделать это автоматически.Вместо этого вы можете сделать это:

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

Надеемся, что модуль подпроцесса правильно передаст вам аргументы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top