2013-03-04 1 views
0

Я пытаюсь сделать некоторые сценарии, но одна из утилит, которые у меня есть, возвращает значение в 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 и вырвать данные, идущие к нему?

Извините, если это невероятно очевидно ... обучение по-разному.

ответ

2

Если вы не ожидали тонну продукции или не против читать это все сразу, вы можете использовать subprocess.check_output:

>>> import subprocess 
>>> print subprocess.check_output(['ls', '/etc']) 
adjtime 
adobe 
anacrontab 
apparmor.d 
arch-release 
ati 
at-spi2 
avahi 
axelrc 
bash.bash_logout 

Если вам нужно прочитать его построчно линии , взгляните на этот вопрос: read subprocess stdout line by line

+0

Так что это будет работать, если я вызову процесс ('ls' в вашем примере) в определенное время. Я пытаюсь понять, как включить эту стратегию с помощью моего candump (который постоянно работает в другом потоке и только выгружает данные по мере его поступления), и мне сложно с ним справиться. Я буду продолжать отключаться, но если у вас есть какие-нибудь проблемы, я бы с удовольствием их услышал. – Chris

+0

@Chris: Тогда проверьте вопрос, с которым я связан. – Blender

+2

@Chris: Что касается ответа, связанного выше, используя '['stdbuf', '-oL' 'candump', 'can0']' может помочь, если 'candump' буферизует свой вывод при передаче по каналу. 'stdbuf -oL' пытается заставить поток stdout использовать линию буферизации, но может не работать. Если он работает, вы можете выполнить итерацию с помощью 'iter (proc.stdout.readline, b '')'. – eryksun

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

  • Нет связанных вопросов^_^