【发布时间】:2015-11-13 02:13:23
【问题描述】:
我有一个使用图像采集卡中的视频的 Java 程序。这个程序是通过pythonlauncher.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
非常感谢您的帮助:-)
【问题讨论】:
-
'-d /dev/video1'几乎可以肯定是一个错误。'-d', '/dev/video1'应该是两个单独的参数。-i 2也一样。您可以使用不带空格的'-d/dev/video1'或-i2,具体取决于使用的解析器。 -
也就是说:您当前的错误不是来自
cat,而是来自v4l2-ctl。 -
...因为您告诉它打开一个名为
<space>/dev/video1的文件,而不是/dev/video1。 -
这在您的错误消息中也很明显,当修复以显示格式时 - 看看它在
/dev之前有两个空格,而不是一个? -
如果你给你的java程序
/dev/video1而不是videopipe会发生什么?在这种情况下,我看不出使用命名管道能给你带来什么。
标签: python linux pipe subprocess cat