Я пытаюсь сделать некоторые сценарии, но одна из утилит, которые у меня есть, возвращает значение в stdout, где я хотел бы присвоить его переменной.Как использовать python для извлечения данных, которые выталкиваются в stdout?
Утилита (candump) постоянно работает и только печатает, когда она получает данные.
import threading
from subprocess import call
import time
class ThreadClass(threading.Thread):
def run(self):
call(["candump","can0"])
t = ThreadClass()
t.start()
time.sleep(1)
call(["cansend", "can0", "-i", "0x601", "0x40", "0xF6", "0x60", "0x01", "0x00", "0x00", "0x00", "0x00"])
возвращает следующие значения, которые я хотел бы использовать в моем питон скрипт:
<0x601> [8] 40 f6 60 01 00 00 00 00
<0x581> [8] 4b f6 60 01 96 08 00 00
документации по candump (что сброс данных в стандартный вывод) является sparse
Есть ли способ, которым я могу использовать stdout и вырвать данные, идущие к нему?
Извините, если это невероятно очевидно ... обучение по-разному.
Так что это будет работать, если я вызову процесс ('ls' в вашем примере) в определенное время. Я пытаюсь понять, как включить эту стратегию с помощью моего candump (который постоянно работает в другом потоке и только выгружает данные по мере его поступления), и мне сложно с ним справиться. Я буду продолжать отключаться, но если у вас есть какие-нибудь проблемы, я бы с удовольствием их услышал. – Chris
@Chris: Тогда проверьте вопрос, с которым я связан. – Blender
@Chris: Что касается ответа, связанного выше, используя '['stdbuf', '-oL' 'candump', 'can0']' может помочь, если 'candump' буферизует свой вывод при передаче по каналу. 'stdbuf -oL' пытается заставить поток stdout использовать линию буферизации, но может не работать. Если он работает, вы можете выполнить итерацию с помощью 'iter (proc.stdout.readline, b '')'. – eryksun