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