【问题标题】:Start a new process and read that process's output启动一个新进程并读取该进程的输出
【发布时间】:2014-08-27 21:14:06
【问题描述】:

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

sudo beacon scan -b | get.py

我想消除 bash 管道的使用并用 python 编写所有内容。我正在尝试并行打开几个进程,以使我的程序按我需要的方式工作。 Process1 需要启动“sudo beacon scan -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 读取数据?我还从 process1 收到一个错误,说“Popen”对象不可迭代,但它仍然运行“信标扫描”命令。这可能是因为“信标扫描”命令不断更新吗?任何意见将是有益的。我在树莓派上使用 Rasbian

【问题讨论】:

  • 查看subprocess.check_output
  • 您可以尝试使用命名管道来交互进程 1 和 2。如果需要,可以使用进程 3 重新生成它们。

标签: python linux bash python-multithreading


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2015-03-22
    • 1970-01-01
    • 2011-07-26
    • 2021-02-25
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多