Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 25, 2020 03:14:38

xis
Зарегистрирован: 2020-10-25
Сообщения: 3
Репутация: +  1  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

Выполняю команду в консоле виндовс: c:\projects\test>git log
В консоле вижу следующий вывод:
===============================================
commit 301f13c5d6e08d66107f3ef9c281fdd1165b1c25 (HEAD -> master)
Author: Xis <xis@xis.is>
Date: Fri Jun 14 12:08:15 2019 +0300

improve log and tests, adjust calc

commit 35417c4aed59f2b9c16b77ea1d430aa4acc07b09
Author: Xis <xis@xis.is>
Date: Thu Jun 13 01:37:51 2019 +0300


===============================================
При этом видно, что строка текст “commit 301f13c5d6e08d66107f3ef9c281fdd1165b1c25” и “commit 35417c4aed59f2b9c16b77ea1d430aa4acc07b09” отображаются оранжевым шрифтом, текст “HEAD” голубым, а “master” зеленым.

Делаю попытку получить этот вывод используя такой код python:
import subprocess
cmd =
data = subprocess.check_output(cmd)
print(data.decode(encoding='ascii'))

в результате получаю такой вывод в консоль:
================================================
commit 301f13c5d6e08d66107f3ef9c281fdd1165b1c25
Author: Xis <xis@xis.is>
Date: Fri Jun 14 12:08:15 2019 +0300

improve log and tests, adjust calc

commit 35417c4aed59f2b9c16b77ea1d430aa4acc07b09
Author: Xis <xis@xis.is>
Date: Thu Jun 13 01:37:51 2019 +0300


===============================================
Хочу обратить внимание на то, что у приведенного выше python скрипта, по сравнению с командой “c:\projects\test>git log” пропал текст “(HEAD -> master)”, а также не видно никаких управляющих символов, которые указывают на цвет шрифта выводимого текста.

Подскажите пожалуйста - как перехватить полный вывод “c:\projects\test>git log”, включая цвет шрифта, и текст “(HEAD -> master)”.

Офлайн

#2 Окт. 25, 2020 03:42:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

Лучше брось эту идею. Устойчивый вариант всё равно не получишь. Перехват консоли Windows не так прост, как тебе кажется, и не сводится к простой записи такой же команды куда-то. А без перехвата тебе придётся долго разбираться в тонкостях, чтобы получить полностью аналогичный вывод. Лучше задайся вопросом: почему одна и та же идентичная команда вручную в консоли даёт одно, а в питоне даёт абсолютно другое? Как такое может быть? Вот такое может быть тогда, когда в консоли “что-то” происходит и тебе это не показывается. А происходит там обычно дофига всего. Консоль - это целый мир с кучей своих зверюшек, про которых никто не знает. Суслика не видишь - а он есть! Так что задайся вопросом: хочешь ли ты знать всё про суслика? Может, у тебя более полезные дела найдутся.



Отредактировано py.user.next (Окт. 25, 2020 03:43:41)

Офлайн

#3 Окт. 25, 2020 13:02:05

xis
Зарегистрирован: 2020-10-25
Сообщения: 3
Репутация: +  1  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

Лучше брось эту идею.
Полностью согласен, и если бы не “очень надо”, даже не читал бы дальше этого предложения. Мне вопрос нужно решить в течение недели (хотябы неустойчиво), в течение которой 10-20 часов могу посвятить этой теме. Потом уже точно не надо будет - если не успел, то не успел.

Перехват консоли Windows не так прост, как тебе кажется, и не сводится к простой записи такой же команды куда-то.

Когда я это понял, решил написать сюда вопрос.

Вот такое может быть тогда, когда в консоли “что-то” происходит и тебе это не показывается.

Над этим я думал где-то в следующем ключе:

  • гит выдает запрошенную информацию в некий поток вывода;
  • запуская гит в консоли, этот вывод попадает в консоль;
  • консоль не может самостоятельно добавить какие-то данные к выводу (т.е. декорации, подмены цветов, подмены управляющих символов и т.п. - конечно может сделать, чтобы красиво отобразить информацию, но именно сгенерировать новые данные (например в середине текста поставить символ конца строки, или какое-нибудь новое слово дописать) консоль не сможет;
  • вывод такой - git передает в консоль достаточно информации для того, чтобы отобразить и цвета и полный текст и т.п. А если так, то почему он не передает такой же полный объем информации в subprocess? Т.е. явно вопрос не в том, какие хитрости использует консоль для отображения полученной информации, и что она прячет, а что нет, и не в том, чтобы перехватить ту информацию которую git посылает в консоль, а в том чтобы понять как достать из git-a эту информацию, ведь он ее всетаки предоставляет.

Из указанного выше, на данный момент у меня возникает три таких предположения:
  1. git предоставляет одинаковый набор данных, что в консоль, что в subprocess, но консоль перехватывает все данные, а subprocess нет. Например, имеется некий поток данных, который в subprocesse не перехватывается. Чтобы проверить это предположение я и составил эту тему, потому как вчера subprocess и параметры его запуска прочитал вдоль и поперек, но однозначного ответа не нашел.

  2. git каким-то образом понимает, что запущен в консоли, у которой есть какой-то набор настроек (например позволяющий обрабатывать управляющие символы) и поэтому в эту консоль предоставляет расширенный вывод данных (например, самостоятельно к полученным командам добавляя свои декораторы –color, –decorate и т.п.). Если ситуация обстоит так, как указано выше, можно предположить, что git запущенный в subprocess-е не видит там настроек позволяющих понимать “красивые” данные, и выдает сокращенный объем данных. Может я всетаки не достаточно доразбирался с subprocess-ом и его параметром env?

  3. имеется некий баг с отработкой управляющих символов. Предположим, git выдает одинаковый набор данных, что в консоль, что в subprocess, но консоль корректно обрабатывает управляющие символы и поэтому красиво отображает полученную информацию, а медоты считывания потомков ввода/вывода из subprocess неправильно обрабатывают управляющие символы, и это приводит в некоторых местах к потере форматирования, а в некоторых к тому, что участки текста игнорируются.

Возможно у кого-то есть другие предположения, дайте знать. На данный момент мне представляется, что второе предположение (с декораторами и с поведением git-а) наиболее вероятно. А первое и третье - как раз мало вероятно. Как вы считаете, какое из предположений более вероятно?

Отредактировано xis (Окт. 25, 2020 13:04:06)

Офлайн

#4 Окт. 25, 2020 15:08:51

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

xis
Мне вопрос нужно решить в течение недели
Если нужно решить задачу то вы ее сформулируйте. Что есть, что надо получить.

А другой способ выдачи у гита возникает при любом перенаправлении потока вывода. И не только под виндой но и под unix Как это сделано надо смотреть в исходных текстах гита.



Отредактировано doza_and (Окт. 25, 2020 15:09:19)

Офлайн

#5 Окт. 25, 2020 15:47:16

xis
Зарегистрирован: 2020-10-25
Сообщения: 3
Репутация: +  1  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

Решение для своей задачи я уже нашел. Осталась простая реализация. Решение выглядит так - вместо этого:

 import subprocess
cmd = ['git', '-C', 'c:\\projects\\test\\', 'log']
data = subprocess.check_output(cmd)

Нужно использовать это:
 import subprocess
cmd = ['git', '-C', 'c:\\projects\\test\\', 'log', '--color', '--decorate']
data = subprocess.check_output(cmd)

Кому-то этого может не хватить, но для моей задачи этого вполне хватает. Чуть более развернуто отписался здесь https://www.cyberforum.ru/python-beginners/thread2717199.html#post14944031

Спасибо. Для меня тема закрыта.

Офлайн

#6 Окт. 25, 2020 22:59:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

xis
консоль не может самостоятельно добавить какие-то данные к выводу (т.е. декорации, подмены цветов, подмены управляющих символов и т.п. - конечно может сделать, чтобы красиво отобразить информацию, но именно сгенерировать новые данные (например в середине текста поставить символ конца строки, или какое-нибудь новое слово дописать) консоль не сможет;
Сможет она сделать всё. И декорации добавить, и вывод заменить. Вывод проходит через неё, поэтому ничего не мешает ей передавать данные по своему усмотрению. Утверждение “Она этого не делает” не очень крепкое. Сегодня не делает, а завтра сделает и у тебя не спросит.

Тут пример того, как консоль (оболочка, с которой связана консоль) подменяет ввод



Отредактировано py.user.next (Окт. 25, 2020 23:14:29)

Прикреплённый файлы:
attachment console_git.png (80,5 KБ)

Офлайн

#7 Окт. 25, 2020 23:06:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

получение вывода из консольного приложения

xis
а в том чтобы понять как достать из git-a эту информацию, ведь он ее всетаки предоставляет
Далеко не факт, что для получения этой информации хватит командной строки. У Git'а могут быть ещё настройки в конфигурационных файлах, которые влияют на вывод. На другом компе запустишь тот же код, а там настроек у Git'а нет. Ты будешь ждать цвета какие-то, так как послал “правильную” команду, а там всё выдаст нецветное. Так ты узнаешь, что зря провозился.



Отредактировано py.user.next (Окт. 25, 2020 23:11:41)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version