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

2024-09-30 14:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Java程序,它使用帧抓取卡上的视频。这个程序是通过pythonlauncher.py启动的。在

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

$ mkfifo videopipe
$ cat /dev/video1>videopipe

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

^{pr2}$

我想自动化这个过程。不幸的是,结果总是一样的: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

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


Tags: dev程序bash终端管道过程javacall
1条回答
网友
1楼 · 发布于 2024-09-30 14:31:14

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

BASH_PIPE_VIDEO = 'cat /dev/video1 > videopipe'

目前,cat作为脚本传递给shell,/dev/video>videopipe作为文本参数传递给该shell,而不是作为脚本文本的一部分进行解析,并且没有任何效果,因为脚本(只调用cat)不查看其参数。在


或者,为了避免不必要的shell使用(以及与shell相关的bug,例如shell shock,以及在接受来自非硬编码源的任何参数时可能发生的注入攻击):

^{pr2}$

在与您的“猫到命名管道”问题无关的注释上,请确保您的空格正确无误。在

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

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

请确保正确地拆分了参数:

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

相关问题 更多 >