私は多くのシェル関数を呼び出すpythonスクリプトを持っています。スクリプトは端末から対話的に実行できます。その場合はすぐに出力を表示するか、crontabによって呼び出されます。この場合、エラー出力を電子メールで送信します。サブプロセスを使ってシェル出力をリダイレクト
私はシェル関数を呼び出すためのヘルパー関数を書きました:
import subprocess
import shlex
import sys
def shell(cmdline, interactive=True):
args = shlex.split(cmdline.encode("ascii"))
proc = subprocess.Popen(args, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
val = proc.communicate()
if interactive is True:
if proc.returncode:
print "returncode " + str(proc.returncode)
print val[1]
sys.exit(1)
else:
print val[0]
else:
if proc.returncode:
print ""
# send email with val[0] + val[1]
if __name__ == "__main__":
# example of command that produces non-zero returncode
shell("ls -z")
を私がいる問題は二つあります。コマンドが完全以来、通信完了するまでシェルコマンドが終了する間(例えば数分)かかり
1)インタラクティブモードでは、私は出力をバッファリング)(何も表示されません。それが来ると出力を表示し、バッファリングを避ける方法はありますか?リターンコードをチェックする方法も必要です。それで、私はcommunications()を使用しています。
2)私が呼び出すシェルコマンドの中には、多くの出力(例:2MB)を生成するものがあります。 communications()のdocumentationには、「データサイズが大きい場合や無制限の場合は、このメソッドを使用しないでください。誰が "large"の大きさを知っていますか?