繁体   English   中英

Linux:在python脚本中将猫命名为管道

[英]Linux: cat to named pipe in a python script

我有一个Java程序,它使用来自framegrabber卡的视频。 该程序通过python launcher.py

读取我发现的视频流的最简单方法是,使Java在命名管道上读取,并且此方法非常有效。 所以我的会话就像:

$ 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作为脚本传递到外壳, /dev/video>videopipe作为文字参数传递到该外壳-根本不解析为脚本文本的一部分,并且自脚本以来没有任何作用(只是调用cat )不会查看其参数。


或者,为避免不必要的外壳程序使用(因此,如果您接受来自非硬编码源的任何参数,则可以避免与外壳程序相关的错误,例如shellshock,以及潜在的注入攻击):

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

在与“猫到命名管道”问题无关的注释上-确保正确设置空格。

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

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

确保正确分割参数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM