簡體   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