2017-01-01 22 views
3

私はstdin経由で入力を受け付けるコマンドラインユーティリティ(exiftool)を持っています。サブプロセスでコマンドを繰り返す.Popen

次のようになりますのpythonからそれを呼び出す:パイプを経由して使用されている

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(catとは異なります)は、行単位での入力ではなく、一部の区切り文字による入力ではなく、チャンク全体の入力として解釈されるようです。しかしおそらく、exiftoolプロセスの標準をハックすることで可能でしょうか?

+2

exiftoolはコマンドラインツールではなく、perlライブラリでもあるようです。おそらくあなたのプログラムの入力を待ち、ライブラリ関数を直接呼び出すperlスクリプトを書くことができます。 – Gribouillis

+1

または、フォークアウトするのではなくPython exifライブラリを使用してください –

+0

exiftoolは標準入力で複数のファイルを受け入れますか? –

答えて

3

正確にこれを行うライブラリPyExifToolがあります。バッチモードでexiftoolを実行して、単一のフォークプロセスを使用して任意の数のファイルからメタデータを抽出します。ボーナスとして、ライブラリ呼び出しによってメタデータがパースされます。

また、exiftoolを完全に排除し、純粋なPython画像操作ライブラリを使用してEXIFデータを読み取ることもできます。ライブラリの推奨はStack Overflowの対象外ですが、いくつかのオプションを見つけることができるa closed questionがあります。質問は7歳であることを覚えておいてください。そのため、回答の現在の有効性を自分で調べる必要があります。

+0

PyExifToolは私のために働き、排除します複数のフォークのオーバーヘッド:** "exiftoolはバッチモードで実行されるため、単一のインスタンスのみを起動し、多くのクエリで再利用することができます。これは、単一のクエリごとに別々のプロセスを起動するよりはるかに効率的です。 * – g33kz0r

関連する問題