2015-08-19 55 views
0

我有一個Java程序,使用一個framegrabber卡的視頻。這個程序是通過python launcher.py啓動的。Linux:貓到Python腳本中的命名管道

讀取我發現的視頻流的最簡單方法是讓Java在命名管道上讀取,而且這種方法非常完美。所以,我會像:

$ mkfifo videopipe 
$ cat /dev/video1>videopipe 

,並在第二終端(因爲cat命令攔截):

$ python launcher.py 

我想這個過程自動化。不幸的是,結果總是相同的:Java應用程序啓動(通過java程序中的打印語句確認),但終端停止,沒有任何內容出現,異常或其他。

由於這個過程手動工作,我想我在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 

一點點的幫助將是非常:-)

+0

''-d的/ dev/video1''幾乎可以肯定是一個錯誤。 ''-d','/ dev/video1'應該是兩個獨立的參數。 '-i 2'也一樣。根據所使用的解析器的不同,您可以使用不帶空格的'-d/dev/video1'或'-i2'。 –

+0

這就是說:你當前的錯誤不是來自'cat',而是來自'v4l2-ctl'。 –

+0

...因爲您要求它打開名爲'/dev/video1'的文件,而不是'/ dev/video1'。 –

回答

2

如果您使用讚賞shell=True,只是傳遞一個字符串:

BASH_PIPE_VIDEO = 'cat /dev/video1 > videopipe' 

目前,cat爲PA作爲腳本發送到shell,並且/dev/video>videopipe作爲文字參數傳遞到該shell - 根本不作爲腳本文本的一部分進行分析,並且自從該腳本(僅調用cat)沒有查看其腳本參數。


可替換地,以避免不必要的外殼使用(並因此殼相關的錯誤,如彈震,和潛在的注入攻擊如果你接受來自非硬編碼源的任何參數):

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

在與您的「貓命名管道」問題無關的註釋中 - 請確保您的空間正確無誤。

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

...使用名稱<space>/dev/video1帶有前導空間,作爲輸入裝置;這與在shell中運行v4l2-ctl "-d /dev/video1"相同,這會導致相同的問題。

要確保你正確地分割你的論點:

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

在嘗試了各種其他更簡潔的「子過程」方法之後,我使用'shell = True'着陸了。我會糾正這一點。正如你在編輯中看到的那樣,我也更精確地分離了這個問題(我認爲)。 – Raoul

+0

@Raoul,新的「孤立」問題幾乎肯定與問題被問到的「貓」過程無關。查看問題本身的評論。 –

+0

太棒了,它的工作原理。唯一剩下的就是'cat'命令仍然被阻塞,所以我需要在另一個程序打開管道,然後繼續開始我的java程序。有沒有辦法讓它無阻塞? – Raoul