2016-01-06 3 views
4

Я использую popen для создания плагина, этот плагин использовал внешнюю программу, которая показывает цветной текст на выходе.Получите выходной цветной текст с помощью Popen

Выход что-то вроде этого:

avr-g++ -o .pioenvs\uno\FrameworkArduino\HardwareSerial.o -c -std=gnu++11 -fno-exceptions -fno-threadsafe-statics -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO -DARDUINO=10607 -I.pioenvs\uno\FrameworkArduino -I.pioenvs\uno\FrameworkArduinoVariant .pioenvs\uno\FrameworkArduino\HardwareSerial.cpp  
avr-g++ -o .pioenvs\uno\FrameworkArduino\HardwareSerial0.o -c -std=gnu++11 -fno-exceptions -fno-threadsafe-statics -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO -DARDUINO=10607 -I.pioenvs\uno\FrameworkArduino -I.pioenvs\uno\FrameworkArduinoVariant .pioenvs\uno\FrameworkArduino\HardwareSerial0.cpp 
============================================= 
Path\file.cpp: in function 'void loop()': 
Path\file.cpp:23:2 error: expected ';' before '}' token 
} 
^ 
============================================= 

Все внутри "=" в красный и желтый.

Когда я запускаю команду в командной консоли, можно увидеть полную мощность, но когда я использую POPEN я только могу получить неокрашенной текст

Это, как я использую POPEN

process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=self.cwd, universal_newlines=True, shell=True) 
output = process.communicate() 

stdout = output[0] 
stderr = output[1] 

print(stdout) 
print(stderr) 

Я хотел бы получить текст, даже если он не окрашен, важно получить полный журнал.

Любое предложение будет оценено

+0

Просьба проголосовать за мой ответ, если это поможет исправить вашу проблему. :) – Rahman

+0

Сделано! спасибо снова :) – GEPD

ответ

4

Вы не в состоянии получить все это сообщение, потому что часть вашего вывода команды не является правильным выходом, это рассматривается как ошибка (или войти или отладочные сообщения)

Теперь вы можете либо добавить stderr=subprocess.PIPE к параметрам вашего POPEN, которая поставит все ошибки в stderr переменной:

process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.cwd, universal_newlines=True, shell=True) 
output = process.communicate() 

stdout = output[0] 
stderr = output[1] 

print(stdout) 
print(stderr) 

ИЛИ если вы хотите, чтобы все ошибки и выход так же, как то, что вы видите в кон Подождите, добавьте 2>&1 в конце вашей команды. что-то вроде:

avr-g++ -o .pioenvs\uno\FrameworkArduino\HardwareSerial.o -c -std=gnu++11 -fno-exceptions -fno-threadsafe-statics -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO_ARCH_AVR -DARDUINO_AVR_UNO -DARDUINO=10607 -I.pioenvs\uno\FrameworkArduino -I.pioenvs\uno\FrameworkArduinoVariant .pioenvs\uno\FrameworkArduino\HardwareSerial.cpp 2>&1 
+1

Спасибо @Rahman, последнее предложение решило мою проблему. У вас есть ссылка, чтобы прочитать что-то об этом решении, или вы можете объяснить мне значение '2> & 1'? – GEPD

+3

@GEPD Вот ссылка, которую я прочитал, прежде чем ответить вам http://stackoverflow.com/a/818284/811922 – Rahman

+0

@GEPD Также см. Раздел «Направления в человеке». –

2

Когда я запускаю команду в командной консоли, можно увидеть полную мощность, но когда я использую POPEN я только могу получить неокрашенной текст

Там может быть два вопросы:

  1. цветной текст случается будет производиться на стандартный вывод ошибок, а не стандартный вывод. Для того, чтобы захватить STDERR, установить stderr=PIPE, as @Rahman suggested

  2. avr-g++ Команда может отключить цвета, если он обнаружит, что выход не является терминал, например, если он будет перенаправлен на трубу, как в вашем случае. Чтобы включить цвета, передайте опцию командной строки -fdiagnostics-color=alwaysas @PM 2Ring suggested.

    Или (менее портативный, но он может работать с большим количеством команд) обеспечивает псевдо-tty, чтобы обмануть команду avr-g++, думая, что она работает в интерактивном режиме (и поэтому она должна включать цвета). Вы можете сделать это с помощью pty.spawn(), pexpect module:

    import pexpect # $ pip install pexpect 
    
    output, exitstatus = pexpect.runu(command, withexitstatus=1) 
    

    или (более низкого уровня) с помощью pty.openpty() + subprocess module.

Смежные вопросы