PythonのSubprocessでBashのパイプを利用したコマンドを実行したい場合、いくつかの方法があるようだ。
1. subprocess.PIPEを利用する
subprocessでは、コマンド実行時にsubprocess.PIPEを使ってstdoutやstderrを変数に代入することができる。 さらにstdinを変数から取得させることができるので、これを利用して出力結果を渡してやればよい。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex
command1 = 'ls /'
command2 = 'sed s/opt/aaa/g'
process1=subprocess.Popen(shlex.split(command1),stdout=subprocess.PIPE)
process2=subprocess.Popen(shlex.split(command2),stdin=process1.stdout)
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex
command1 = 'ls /'
command2 = 'sed s/opt/aaa/g'
process1=subprocess.Popen(shlex.split(command1),stdout=subprocess.PIPE)
process2=subprocess.Popen(shlex.split(command2),stdin=process1.stdout)
[root@BS-PUB-CENT7-01 ~]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@BS-PUB-CENT7-01 ~]# /tmp/test.py
bin
boot
dev
etc
home
lib
lib64
media
mnt
aaa
proc
root
run
sbin
srv
sys
tmp
usr
var
2. subprocess.callやPopenでshell=Trueをする
より簡単に記述したい場合は、以下のようにコマンド実行時に「shell=True」を指定する。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
command = 'ls / | sed s/opt/aaa/g'
subprocess.call(command,shell=True)
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
command = 'ls / | sed s/opt/aaa/g'
subprocess.call(command,shell=True)
[root@BS-PUB-CENT7-01 ~]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@BS-PUB-CENT7-01 ~]# /tmp/test.py
bin
boot
dev
etc
home
lib
lib64
media
mnt
aaa
proc
root
run
sbin
srv
sys
tmp
usr
var