![](/img/trans.png)
[英]Linux: Pipe into Python (ncurses) script, stdin and termios
[英]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.