Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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:閉じてたり、そもそも存在しないパイプやソケットに書き込みしようとした