Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

subprocessライブラリでパイプ処理をする

前回の続き。
シェルの醍醐味(?)といえばパイプ処理。

実際のところ

output=`dmesg | grep hda`

に相当するコマンドが、以下の様に。

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) #入力はp1のstdout
p1.stdout.close()  # 他のプロセスがあったとき、p1がSIGPIPEを掴めるようにする。
output = p2.communicate()[0]

……なんか可読性が低いような気がしないでもないですが、
移植性を高めるためにやむなしって感じなんですかね??

シグナル関係は不勉強もいいとこなのですが、
どうもSIGPIPEシグナル*1は結構悪さをするケースがあるようですね。
第6回 UNIXプログラミングの勘所(3):Perl Hackers Hub|gihyo.jp … 技術評論社

*1:閉じてたり、そもそも存在しないパイプやソケットに書き込みしようとした