Форум сайта python.su
Имеется процесс xterm, который “вставлен” в Tk-окно:
class Terminal(tk.Frame): def __init__(self, parent): ... # Получение tty с которым будет работать терминал (грубый хак) os.system('xterm -into %d -geometry 160x50 -sb -e "tty > /tmp/ttyinfo.txt"' % self.wid) fp=open('/tmp/ttyinfo.txt', 'r') self.tty=fp.readline().strip(); fp.close(); print("tty info: "+self.tty) # Открытие терминала с bash. Перед запуском bash выводится рабочий tty os.system('xterm -into '+str(self.wid)+' -geometry 160x50 -sb -e "tty ; bash -norc" &')
1. ip -color addr
2. ansible-playbook ourPlaybook.yml
# Выполнение команды в терминале - вариант 1 def doCommand1(self, text) : cmdLine="(%s) <%s >%s 2> %s" % (text, self.tty, self.tty, self.tty) result=os.system(cmdLine) ... return result # Выполнение команды в терминале - вариант 2 def doCommand2(self, text) : cmdLine="%s" % (text) resultTriada=command.run(cmdLine) log.echo("* Результат: " +resultTriada[0]) log.echo("* Вывод ошибок: "+resultTriada[1]) log.echo("* Код возврата: "+str(resultTriada[2])) ... # Возвращается кортеж из stdOut, stdErr, errCode return resultTriada
class Command(): # Запуск внешней программы def run(self, cmd): p=Popen(cmd, stdout=PIPE, shell=True) stdOutData, stdErrData = p.communicate() errCode=p.returncode outData="" errData="" if not stdOutData is None : outData=stdOutData.decode() if not stdErrData is None : errData=stdErrData.decode() # Убирается последний перенос строк, чтобы в конце небыло пустой строки outData=re.sub("\n$", '', outData) errData=re.sub("\n$", '', errData) return(outData, errData, errCode)
Офлайн
В общем, проблема оказалась в Ansible. Он сам отключает цветной вывод если терминал, через который он выводит сообщения, чем-то ему не нравится. os.sytem() ему нравится, а Popen+communicate - не нравится.
Подробности; https://www.linux.org.ru/forum/development/17205600
Чтобы Ansible всегда заставить выводить цвет, можно установить переменную среды
ANSIBLE_FORCE_COLOR=True
Офлайн