Linux:cat 到 python 脚本中的命名管道

Linux: cat to named pipe in a python script

我有一个 Java 程序,它使用来自帧采集卡的视频。此程序是通过 python launcher.py.

启动的

我发现读取视频流的最简单方法是让 Java 在命名管道上读取,这非常有效。所以我的 session 就像:

$ mkfifo videopipe
$ cat /dev/video1>videopipe

并在第二个终端中(因为 cat 命令被阻塞):

$ python launcher.py

我想自动化这个过程。不幸的是,结果总是一样的:Java 应用程序启动(通过 java 程序中的 print 语句确认),但随后终端停止并且没有任何显示,异常或其他。

由于这个过程是手动进行的,我想我在 python 程序中做错了什么。为了简化事情,我隔离了管道部分:

from subprocess import call, Popen, PIPE, check_call

BASH_SWITCHTO_WINTV = ['v4l2-ctl', '-d /dev/video1', '-i 2', '--set-standard=4']
BASH_CREATE_FIFO_PIPE = ['mkfifo', 'videopipe']
BASH_PIPE_VIDEO = 'cat /dev/video1>videopipe'

def run():
    try:
        print('running bash commands...')
        call(BASH_SWITCHTO_WINTV)
        call(BASH_CREATE_FIFO_PIPE)
        Popen(['cat', '/dev/video1'], stdout=open('videopipe', 'w'))
    except:
        raise RuntimeError('An error occured while piping the video')

if __name__ == '__main__':
    run()

当 运行 时输出:

running bash commands...     
Failed to open  /dev/video1: No such file or directory

如果能提供一点帮助,我们将不胜感激:-)

如果您使用 shell=True,只需传递一个字符串:

BASH_PIPE_VIDEO = 'cat /dev/video1 > videopipe'

目前,cat 作为您的脚本传递给 shell,而 /dev/video>videopipe 作为文字参数传递给 shell -- 未解析为部分完全没有脚本文本,并且没有任何效果,因为脚本(仅调用 cat)不查看其参数。


或者,为了避免不必要的 shell 使用(因此 shell 相关的错误,例如 shellshock,以及如果您接受来自非-硬编码源):

Popen(['cat', '/dev/video1'], stdout=open('videopipe, 'w'))

关于与您的 "cat to named pipe" 问题无关的注释 -- 请确保您的 space 正确。

BASH_SWITCHTO_WINTV = ['v4l2-ctl', '-d /dev/video1', ...]

...使用名称 <space>/dev/video1 和前导 space 作为输入设备;它与shell中的运行 v4l2-ctl "-d /dev/video1"相同,这将导致相同的问题。

确保你正确地分解了你的论点:

BASH_SWITCHTO_WINTV = ['v4l2-ctl', '-d', '/dev/video1', ...]