我有一个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
答案 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