启动一个新进程并读取该进程的输出

时间:2014-08-27 21:14:06

标签: python linux bash python-multithreading

我有一个python脚本从管道bash脚本中读取数据

sudo beacon scan -b | get.py

我想消除使用bash管道并在python中编写所有内容。我尝试并行打开几个进程,让我的程序按照我需要的方式工作。 Process1需要启动' sudo信标扫描-b'命令并保持运行。 Process2需要将该数据发送到我的服务器。最后一个进程需要监视process1或process2是否正常工作,如果没有重启它们。

我已经编写了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()

这会正确运行该过程,但如何让我的第二组代码从process1读取数据?

过程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。如何让process2从process1读取数据?我也从进程1那里得到一个错误,说'Popen'对象不可迭代,但它仍然运行'信标扫描'命令。这可能是因为'信标扫描'命令不断更新?任何意见将是有益的。我在Raspberry Pi上使用Rasbian

1 个答案:

答案 0 :(得分:1)

以下代码可以满足您的需求:

1)它将脚本作为子进程运行。 (为了测试目的,我将其更改为运行“ping”3秒钟。)

2)当每个行从子进程发出时,父proc处理它。在这种情况下,它会调用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