これからの仕事でpythonが必要になるので、pythonスクリプトをたくさん作ってみることにしました。
環境:python3
#レシピ1 pythonで外部コマンドを実行するスクリプト
exec_shell.py
# coding: utf-8
"""使用法
exec_shell.py コマンドが記載されたxmlファイル
コマンドが記載されたxmlファイルのcommandタグをパースし、
パースしたコマンドを実行するスクリプト
"""
#モジュールインポート
from subprocess import Popen,PIPE
import xml.etree.ElementTree as et
import sys
#変数定義
cmdfile=sys.argv[1]
tree=et.parse(cmdfile)
cmd=tree.find(".//code").text
#関数定義
def main(cmd):
p=Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE)
result=p.communicate()
return result
#メイン処理
if __name__ == '__main__':
result=main(cmd)
print('標準出力結果: ' + str(result[0]))
print('標準エラー出力結果: ' + str(result[1]))
##ポイント1 subprocessモジュールを利用した外部コマンドの実行
今は、「os.commands」を使用するのではなく、subprocessモジュールを利用するのが普通らしいですね。
subprocess.call()は、コマンドの戻り値しか扱えないみたいなので、Popenを使用することにします。
##ポイント2 外部コマンドの実行結果はタプル内に格納されています。
本スクリプトだと、result[0]に標準出力結果が、result[1]が標準エラー出力結果が格納されています。
##ポイント3 実行するコマンド
実行するコマンドは、リダイレクト等も含めて、cmd変数に入れています。これにより、コマンドが変わった場合はcmd変数のみ変えればよいことになります。
エラーハンドリングをもう少し追加する予定です。