Help us understand the problem. What is going on with this article?

python上でunixコマンドを実行する

More than 3 years have passed since last update.

subprocessモジュールを用いてコマンドを実行する。
(※ subprocess.run()関数について追記:2/15 23:30 )

コマンドを実行する

subprocess.call(cmd)

基本的な使い方。
引数として与えられたコマンドをただ実行する。
コマンド実行が成功したら 0 が返る。

サンプル

import subprocess
res = subprocess.call('ls')
#=> lsコマンドの結果
print res
#=> コマンドが成功していれば 0

コマンドを実行する(失敗時、CalledProcessErrorをあげる)

subprocess.check_call(cmd)

引数として与えられたコマンドを実行する。
コマンド実行が成功したら 0 が返る。
失敗時、CalledProcessError 例外をあげてくれるので、try-exceptで処理できる。

サンプル

import subprocess
try:
    res = subprocess.check_call('dummy')
except:
    print "Error."
#=> Error. 

実行できないコマンドが与えられた場合、例外処理が行える。

コマンドを実行し、その出力を取得する

subprocess.check_output(cmd)

引数として与えられたコマンドを実行する。
コマンド実行が成功したら、その出力を返す。
check_callと同様に、失敗時、CalledProcessError 例外をあげてくれるので、try-exceptで処理できる。

サンプル

import subprocess
try:
    res = subprocess.check_output('ls')
except:
    print "Error."
print res
#=> lsの実行結果 

ここまでで、簡単なコマンドを実行することが可能。
最後に、引数を伴うコマンドの実行について。

コマンドに引数を加えて実行する

subprocess.call(*args)

check_call, check_outputについても同様。
配列によって、コマンドや引数を指定する。

サンプル

import subprocess
args = ['ls', '-l', '-a']
try:
    res = subprocess.check_call(args)
except:
    print "Error."
#=> "ls -l -a" の実行結果

subprocess.run(cmd)

@MiyakoDevさんからいただいたコメントを反映 )
Python3.5より、上記3つのコマンドをひとまとめにした subprocess.run() 関数が追加された。

サンプル

import subprocess
import sys

res = subprocess.run(["ls", "-l", "-a"], stdout=subprocess.PIPE)
sys.stdout.buffer.write(res.stdout)

出力を得るサンプルコード。
出力はバイト列として返ってくる。

参考

osモジュールを使った os.system やcommandsモジュールを使った commands.getstatusoutput がありましたが、現在は推奨されていないようです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away