Форум русскоязычного сообщества Ubuntu


Автор Тема: Получение вывода внешнего процесса в Питоне  (Прочитано 2710 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
Только собрался делать задуманные вещи столкнулся с проблемой, а как же собственно перехватить вывод консоли? Использую модуль os. Например os.system('ls -lah') Пытаюсь присвоить вывод команды переменной - не выходит. Читал про popen и модуль subprocess, но к сожалению еще больше запутан. Есть какой то очевидный способ решения столь простой задачи?
« Последнее редактирование: 01 Апрель 2015, 10:43:24 от Sly_tom_cat »
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #1 : 29 Март 2015, 23:14:06 »
Надо subprocess использовать для таких вещей. Там все элементарно
Код: Python
  1. strOutput = subprocess.check_output(['<команда>'])

Только стоит в try except обернуть что бы ошибки отловить.
« Последнее редактирование: 29 Март 2015, 23:15:42 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #2 : 29 Март 2015, 23:29:20 »
Может в моем случае все запутанно и ваша функция не самый лучшее решение или я ошибся с синтаксисом.
Код: Python
  1. scale = subprocess.check_output( 'zenity', '--scale --title=\"Уровень цвета СИНИЙ\" \
  2.       --text=\"Установите требуемый уровень синего цвета\" \
  3.       --min-value=0 --max-value=255 --value=100 --step=5')
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #3 : 30 Март 2015, 11:02:00 »
Да ничего не запутано просто внимательно нужно читать описание функции и следить за синтаксисом.
Там не список аргументов надо передавать, а массив. Кроме того все аргументы (уже не знаю почему) но нужно передавать отдельными элементами массива.

Код: Python
  1. scale = subprocess.check_output( ['zenity', '--scale', '--title=\"Уровень цвета СИНИЙ\"', '--text=\"Установите требуемый уровень синего цвета\"', '--min-value=0', '--max-value=255', '--value=100', '--step=5'])
  2.  

И еще поясните, что вы называете "не самый лучшее решение"? :idiot2: ... если сыплются ошибки - то это не повод считать чужие советы неумными, а повод разобраться как добиться выполнения команды без ошибок....
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #4 : 30 Март 2015, 11:22:41 »
я вовсе не считаю ваш совет плохим, просто более детально расписал команду которую хочу использовать. В зависимости от конкретной ситуации может вы подскажете еще что.
З.ы. Есть какойто справочник с описанием модулей и их методов, кроме как на английском.
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #5 : 30 Март 2015, 12:42:50 »
Я немного ковырялся с вызовом внешних программ из питона и то что вам посоветовал - результат моих поисков в этом направлении. Т.е. то что я счел самым простым и удобным для такой задачи. А еще - все расписано в хелпах по питону (https://docs.python.org/3/)

К сожалению без английского (хотя бы на уровне "чтения со словарем", сейчас с успехом заменяемого автоматическими переводчиками типа гуглтранслейт) в программировании делать - нечего.
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 30 Март 2015, 12:47:28 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Master_Sergius

  • Активист
  • *
  • Сообщений: 528
  • i3
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #6 : 30 Март 2015, 14:08:54 »
как по мне, Popen - круче
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #7 : 30 Март 2015, 14:33:43 »
Master_Sergius, Popen требует гораздо больше всяких наворотов для решения той же задачи что решает subprocess. subprocess - это более высокоуровневая библиотека (внутри там, на самом деле - popen используется).

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

Причем, как по мне, так в subprocess предусмотрели все возможные варианты использования вызовов внешних программ, так что очень трудно представить - для чего нужно было бы опускаться на более низкий уровень popen :idiot2:
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #8 : 30 Март 2015, 19:57:42 »
Sly_tom_cat, проверил ваше решение. Все путем. Спасибо!
Единственное что, почему вывод такого формата b'100\n'? Ну я понимаю строка, перевод каретки, а 'b' это байтовая строка?
(Нажмите, чтобы показать/скрыть)
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #9 : 30 Март 2015, 20:09:31 »
В Python3 эта функци subprocess возвращает байтовый массив, если не указан парамеметр universal_newlines=True (по умолчанию он False), если же указано universal_newlines=True, то возвращается строка (в кодировке заданной по умолчанию).
В Python 2.7 возвращается всегда массив байт (но там это не столь критично, т.к. разницы между байтовым массивом и строкой в 2.7 практически нет, чего нельзя сказать про Python3).
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #10 : 30 Март 2015, 21:42:22 »
насолько я понял из руководства модуль subprocess призван заменить os.system и os.spawn*. Выходит про os.system можно забыть?
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Перехват вывода консоли в Питоне
« Ответ #11 : 31 Март 2015, 00:14:21 »
Luca Brasi, И да и нет.
Для большинства стандартных задач модуля subprocess вполне достаточно.
Для очень специфичных задач может потребоваться залезть на более низкий уровень библиотек или восе перейти на C/C++ (благо все это описано в стандартной документации).

Собственно любая высокоуровневая (универсальная) библиотека скрывает использование служебных примитивов (типа тех же pipe), но скрывая эти механизмы не позволяет тонко настраивать их, а значит оптимизировать их использование под специфичные задачи. Так что универсальность - не панацея от всех болячек.
 
(Нажмите, чтобы показать/скрыть)
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
еще один момент. Не очень то мне понятный. Вот к примеру я хочу перехватить вывод команды, дальше его парсить ну и т.п.  допустим вывод идет в файл. При этом файл пишется безостановочно. Как выйти из процесса? Ну имитация crtl+c
« Последнее редактирование: 01 Апрель 2015, 11:28:14 от Luca Brasi »
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12075
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
В принципе ctrl-c можно процессу и послать через открытый пайп для общения с ним, но для этого нужен уже отдельный поток (т.к. тот поток, что запустит выполнение внешнего процесса будет занят).

Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Luca Brasi

  • Автор темы
  • Активист
  • *
  • Сообщений: 704
  • typical engineer
    • Просмотр профиля
то есть создаю отдельный поток посылаю его ранее созданному потоку?
Ubuntu 18.04/ AMD Ryzen 5 2600 3.4GHz/ MSI B450-A Pro Max / Crucial DDR4-3000 16384MB / MSI PCI-Ex GeForce GT 710 2048 MB / Chieftec GPS-600

 

Страница сгенерирована за 0.137 секунд. Запросов: 24.