Python_シェルコマンドを実行する

Pythonからシェルコマンドを実行する(subprocess)

Pythonからシェルコマンドを実行するにはsubprocessというモジュールを使います。

python 3.5以前は、osモジュールを使う方法が一般的でしたが、osモジュールは将来的に廃止される予定です。


subprocess.call(cmd)

subprocess.call()は、引数として与えられたコマンドを実行します。

コマンド実行が成功したら 0 を返し、失敗したら0以外の値を返します。

引数には"ps -ef"などダブルクォーテーションで囲うことでコマンドのオプションを付随できます。



#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse
import subprocess


def main():
    parser = argparse.ArgumentParser(description='description')
    parser.add_argument("cmd", help="Specify command", type=str)
    args = parser.parse_args()

    print("command=%s" % args.cmd)

    rc = subprocess.call(args.cmd, shell=True)
    if rc != 0:
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())

subprocess.check_call(cmd)

subprocess.check_call()はコマンド失敗時、CalledProcessError 例外を挙げます。

これにより「try-except」でエラー処理が可能となります。



#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse
import subprocess


def main():
    parser = argparse.ArgumentParser(description='description')
    parser.add_argument("cmd", help="Specify command", type=str)
    args = parser.parse_args()

    print("command=%s" % args.cmd)

    try:
        subprocess.check_call(args.cmd, shell=True)
    except:
        print("Unexpected error:", sys.exc_info()[0])
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())

subprocess.check_output(cmd)

subprocess.check_output()はシェルコマンドの返り値を利用することができます。



#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse
import subprocess


def main():
    parser = argparse.ArgumentParser(description='description')
    parser.add_argument("cmd", help="Specify command", type=str)
    args = parser.parse_args()

    print("command=%s" % args.cmd)

    try:
        result = subprocess.check_output(args.cmd, shell=True)
        print(result)
    except:
        print("Unexpected error:", sys.exc_info()[0])
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())

subprocess.Popen(cmd)

Popenを使うことで複数の処理を並列実行することができます。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse
import subprocess


def main():
    try:
        proc = subprocess.Popen("sleep 10", shell=True)
        print("process id=%d" % proc.pid)
        subprocess.Popen("ps f", shell=True).communicate()
        proc.wait() # プロセスを待ち合わせる
        # popen.terminate()やpopen.poll()といったコマンドが利用可能です。
    except:
        print("Unexpected error:", sys.exc_info()[0])
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())


関連ページ