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
lib64
media
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
lib64
media
release: 2021-03-24
update: 2021-03-20