トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

OS上のコマンドを実行.py

[Python]

os.system(command_string)

import os
引き数に指定した文字列を、OSのコマンドと解釈して実行する。
戻り値はコマンドの実行ステータス。

subprocessモジュール

Python3以降はこれを使う。

単にコマンドを実行する

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

subprocess.call(["ls", "-l"])

標準出力を得る

標準出力がバイト型で返される。
output_results_by_bytes = subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)

subprocess.check_output(["echo", "Hello World!"])

Popenクラス

Popenのインスタンスが作成されると、argsで指定したコマンドは即座に実行される。callと違ってコマンドの実行終了は待機されない。
Popenのインスタンスに対してはさまざまな操作が可能。
p = subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

p = subprocess.Popen(["ping", "-c", "50", "10.0.0.1"])

wait

subprocess.callはコマンドの実行終了を待つ。subprocess.Popenはコマンドの実行終了を待たない。使い分け。

shlex.split()

実行したいコマンド文字列を組み立ててsubprocessに渡して実行する、という場面が多いだろう。しかしsubprocessには通常、そのままコマンド文字列を渡せない。「実行コマンドと引数の文字列のリスト」を渡さなければならない。
これを簡単に実現できるのがshlex.split()。

import shlex
import subprocess

CommandStringBase = "ping -c {0} {1}"
command_string = CommandStringBase.format(sys.argv[1], sys.argv[2])
subprocess.call(shlex.split(command_string))

ただし、この方法ではリダイレクトが使えない。リダイレクトを使いたい場合にはshellオプションを使う。下記参照。

shellオプションの指定

デフォルトはshell=False。shell=Falseの場合、subprocessのメソッドには引数argsとして、「実行コマンドと引数のリスト」を渡さなければならない。同一シェル上で実行されるため、Popenで実行後の操作が可能。しかしシェルのリダイレクトは使用できない。
これに対して、shell=Trueと指定すると、subprocessのメソッドの引数argsに、シェルが解釈できる実行コマンド文字列をそのまま渡す。別のシェルが起動されてその上で実行される(forkに近い?)。
この方法だと、シェルのリダイレクトが使える。しかし別シェルで実行されるため、Popenインスタンスの一部のメソッドは動作しないようだ。terminateとかkillが効かなかった。

シェルのリダイレクトを使用したい場合にshell=Trueを使用することになるだろう。

subprocess.call("ping 10.0.0.1 > `date +%m%d`-pingreport.log", shell=True)

あるいは、Popenインスタンスを後で操作したい場合にのみshlex.split()とshell=Falseで書くということかもしれない。

Depreciated: commandsモジュール

import commands
コマンドの実行結果をユニコード文字列で取得するには、こちらを使う。

(status_code, output_string) = commands.getstatusoutput(command_string)

ステータスコードとアウトプット文字列をタプルで返す。

output_string = commands.getoutput(command_string)

シェルスクリプトやPerlのバッククォートに当たる。

output_string = commnads.getstatus(file_path)

指定したファイルに対して"ls -ld"した結果を返す。
つまり、ファイル情報を返す。