PythonのSubprocessでコマンドの実行結果を出力させない

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に吐かれることになる。

Sponsored Links

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

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*