Запустите новый процесс и прочитайте вывод этого процесса.

У меня есть скрипт python, который считывает данные из скрипта bash с конвейером.

sudo beacon scan -b | get.py

Я хочу отказаться от использования конвейера bash и написать все на python. Я пытаюсь открыть несколько процессов параллельно, чтобы моя программа работала так, как мне нужно. Процессу 1 необходимо запустить команду «sudo beacon scan -b» и поддерживать ее выполнение. Process2 должен отправить эти данные на мои серверы. Последний процесс должен отслеживать, работают ли процесс 1 или процесс 2, а если нет, то перезагружать их.

Я написал process1 и process2.

процесс1:

#!/usr/bin/python
import subprocess
import multiprocessing

cmd = ['sudo', '/usr/local/bin/beacon', 'scan', '-b']
def scan():
   x = multiprocessing.Process(args=(subprocess.Popen(cmd)))
   x.start()
   x.join()

scan()

Это правильно запускает процесс, но как мне получить второй набор кода для чтения данных из процесса1?

процесс2

import requests

for line in fileinput.input() #This needs to call the other process?
   if line.startswithh('ibeacon'):
      line = line.strip()
      a = line.split(' ')[1]
      a = line.split(' ')[2]
      a = line.split(' ')[3]
      a = line.split(' ')[4]
      a = line.split(' ')[5]
      payload = {'uuid': a, 'major': b, 'minor': c, 'power': d, 'rssi': e}
      r = requests.get('http://posttestserver.com/post.php', params=payload)

Я еще не знаю, как кодировать process3, но мне нужно, чтобы process1 и 2 работали в первую очередь. Как заставить процесс 2 читать данные из процесса 1? Я также получаю сообщение об ошибке от процесса 1, в котором говорится, что объект «Popen» не является итерируемым, но он по-прежнему запускает команду «beacon scan». Может ли это быть из-за того, что команда «сканирование маяков» постоянно обновляется? Любые советы будут полезны. Я использую Rasbian на Raspberry Pi.


person Thomas Hall    schedule 27.08.2014    source источник
comment
Проверьте subprocess.check_output   -  person hlt    schedule 28.08.2014
comment
Вы можете попробовать использовать именованный канал для взаимодействия процессов 1 и 2. И использовать процесс 3 для их повторного появления, если это необходимо.   -  person user3132194    schedule 28.08.2014


Ответы (1)


Следующий код делает то, что вы хотите:

1) он запускает скрипт как подпроцесс. (Я изменил его, чтобы запускать «ping» в течение 3 секунд для целей тестирования.)

2) поскольку каждая строка выводится из подпроцесса, родительский процесс обрабатывает ее. В этом случае он вызывает send_beacon(), передавая некоторые данные на другой сервер.

3) №3 нет. Выгода!

источник

import requests, subprocess

def send_beacon(line):
    if line.startswith('ibeacon'):
          line = line.strip()
          a = line.split(' ')[1]
          a = line.split(' ')[2]
          a = line.split(' ')[3]
          a = line.split(' ')[4]
          a = line.split(' ')[5]
          payload = {'uuid': a, 'major': b, 'minor': c, 'power': d, 'rssi': e}
          r = requests.get('http://posttestserver.com/post.php', params=payload)

if __name__=='__main__':
    if 0:
        cmd = ['sudo', '/usr/local/bin/beacon', 'scan', '-b']
    else:                       # testing
        cmd = 'ping -c3 8.8.8.8'.split()
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    for line in iter(proc.stdout.readline, ''):
        print 'X:',line,
        send_beacon(line)

выход

X: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
X: 64 bytes from 8.8.8.8: icmp_seq=1 ttl=43 time=46.9 ms
X: 64 bytes from 8.8.8.8: icmp_seq=2 ttl=43 time=94.5 ms
X: 64 bytes from 8.8.8.8: icmp_seq=3 ttl=43 time=48.1 ms
X: 
X: --- 8.8.8.8 ping statistics ---
X: 3 packets transmitted, 3 received, 0% packet loss, time 2002ms
X: rtt min/avg/max/mdev = 46.922/63.221/94.554/22.161 ms
person johntellsall    schedule 29.08.2014