PythonのSubprocessでOSのコマンドを実行した際、デフォルトの動作だとその実行結果(stdout/stderrともに)はコンソール上に出力してしまう(スクリプト化してても同様)。

[root@BS-PUB-CENT7-01 ~]# # そのままSubprocessを実行すると、結果が出力されてしまう
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex

command = 'ls /'
subprocess.Popen(shlex.split(command))

[root@BS-PUB-CENT7-01 ~]# /tmp/test.py
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

1.普通に非表示にする(/dev/nullに吐かせる)場合

これを非表示にする場合、Popenでコマンド実行時に以下のように指定する。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex

command = 'ls /'

devnull = open('/dev/null', 'w')
subprocess.Popen(shlex.split(command), stdout=devnull, stderr=devnull)

これで、標準出力・標準エラー出力ともに/dev/nullに吐かれることになる。

2. 変数に入れて後で再利用する場合

「ちょ、待てよ」と、そんな乱暴なことしないで変数に入れて後で再利用するよといった場合は、subprocess.PIPEに渡してやることでコンソールに出力させず、後から再利用が可能だ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex

command = 'ls /'

proc = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output_stdout = proc.stdout.read() # 標準出力の場合
output_stderr = proc.stderr.read() # 標準エラー出力の場合
[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Aug 18 2016, 15:58:25)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> #!/usr/bin/env python
... # -*- coding: utf-8 -*-
... import subprocess,shlex
>>>
>>> command = 'ls /'
>>>
>>> proc = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> output_stdout = proc.stdout.read() # 標準出力の場合
>>> output_stderr = proc.stderr.read() # 標準エラー出力の場合
>>> print output_stdout
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var