PythonのSubprocessでBashのパイプを利用したコマンドを実行したい場合、いくつかの方法があるようだ。

1. subprocess.PIPEを利用する

subprocessでは、コマンド実行時にsubprocess.PIPEを使ってstdoutやstderrを変数に代入することができる。 さらにstdinを変数から取得させることができるので、これを利用して出力結果を渡してやればよい。

python
#!/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)
shell
[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」を指定する。

python
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess command = 'ls / | sed s/opt/aaa/g' subprocess.call(command,shell=True)
shell
[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