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', ...]
我有一个 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', ...]