2017-01-01 121 views
3

我有一個命令行實用程序(exiftool),它通過stdin接受輸入。重複命令與子進程.Popen

蟒蛇稱它可能是這樣的:

ps = Popen(['exiftool','-groupNames','-json', '-'], stdin=PIPE, stdout=PIPE) 

管的地方通過使用:

with open(ffile, 'r') as fh: 
    ps.stdin.write(fh.read()) 
ps.stdin.close() 
print ps.stdout.read() 
ps.wait() 

正如預期的那樣,這個輸出與所ffile傳遞的內容運行exiftool的結果作爲論據。

我可以在循環中重複調用此代碼,但每次調用都會產生一個fork,實際上它很慢(這不是過早優化的情況)。

所以我想知道是否有一種方法來打開exiftool一次,然後「重複使用」Popen,管道多個文件到它,並保存每個輸出。

看起來好像不可能,因爲exiftool(與貓不同)似乎將其輸入解釋爲整個塊,而不是逐行或根據某個分隔符。但也許這可能通過黑客exiftool進程的stdin?

+2

看來exiftool不僅是一個命令行工具,它也是一個perl庫。你也許可以編寫一個等待程序輸入並直接調用庫函數的perl腳本。 – Gribouillis

+1

或者,使用Python exif庫而不是分出 –

+0

exiftool是否接受其stdin上的多個文件? –

回答

3

有一個庫PyExifTool它正是這樣做的:它以批處理模式運行exiftool以使用單個分叉進程從任意數量的文件中提取元數據。作爲獎勵,圖書館電話會爲你解析元數據。

或者,您可以完全放棄exiftool並使用純Python圖像操作庫來讀取EXIF數據。推薦一個庫超出堆棧溢出的範圍,但仍有a closed question,您可以在其中找到一些選項。請記住,問題已經七年了,所以你應該自己檢查答案的當前有效性。

+0

PyExifTool爲我工作並消除多個分支的開銷:**「由於exiftool以批處理模式運行,只需要啓動一個實例並可以重複使用多個查詢,這比爲每個查詢啓動一個單獨的進程效率更高。」* * – g33kz0r