将原始流数据从stdout转换为python程序

时间:2018-03-06 23:58:47

标签: python linux subprocess pipe

我有一个hackrf硬件单元,它将连续的原始uint8数据流提供给linux shell管道。

例如,这会将连续数据传输到linux shell中的另一个应用程序,如下所示:

(-(n/(f-n)))阳离子)

在python中,这将做同样的事情:

hackrf_transfer -r /dev/stdout -f 92700000 -s 8000000 - | (another appli

但是我无法将Hackrf管道流变成python脚本。例如,我可能想要对原始数据流进行抽取或以某种方式对其进行操作,然后将其发送到另一个子进程应用程序等,如下所示:

  

(HackRF)源子流程>>一个python脚本>>接收子过程(例如   baudline)

或在单个python脚本中:

  

source hackrf>> my_function>>接收器应用

我可以做源>>在python脚本中接收,其中两个应用程序已经接受shell命令,例如hackrf子进程管道进入Baudline子进程stdin管道。换句话说,如果两个应用程序使用管道在shell中工作,则它在python子进程调用中工作。但是我无法在这个shell管道之间获得python函数来使用python脚本或函数来改变数据。

有没有人对我如何做到这一点有任何想法?

1 个答案:

答案 0 :(得分:0)

hackrf_transfer的输出是一个字节流,而不是面向行的,因此readlines()不起作用;请改用read(8*1024)

  

如果我使用hackout.stdout.read()或hackout.communicate,它会“吸收”数据流。

对,那些没有参数的调用不能用于并行读取连续数据流。

这就是我告诉我使用read(8*1024)

的原因
  

它没有运行错误或消息:data = hackout.stdout.readlines(8 * 1024)但我想把它拿到stdout。我试过sys.stdin.write(数据)它没有写,但它看到'数据'作为一个列表。因此它捕获了数据,但我无法将捕获的数据写回来。

我希望你的意思是read而不是readlines,因为我在本文开头所说的原因。

以下是工作代码的草图,基于您在同时删除的“答案”中发布的内容:

hackout = subprocess.Popen(['hackrf_transfer', …], stdout=subprocess.PIPE)
# We need to start the "sink subprocess" at the outset, and that with stdin=PIPE
baudline = subprocess.Popen("baudline … -stdin …", stdin=subprocess.PIPE, shell=True)

def decimator():
    for iq_samples in iter(lambda: bytearray(hackout.stdout.read(8*1024)), b''):
        # convert the samples chunk for use by numpy, if you wish
        dat = np.array(iq_samples)
        dat = dat.astype(float)/255
        # dat = … do further processing, as you wish    
        # now convert data back for use by baudline -format u8 and write out
        baudline.stdin.write((dat*255).astype('i1').tostring())

decimator()