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())
関連ページ
- Python
- Python_シェルコマンドを実行する
- Python_HTML解析
- Python_jsonファイルの扱い
- Python_urllibでHTTPリクエスト
- Python_マークルツリーを実装する