Пересылка аргументов командной строки в процесс в Python
-
13-09-2019 - |
Вопрос
Я использую сырую 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)
Надеемся, что модуль подпроцесса правильно передаст вам аргументы.