os.system
systemメソッドは、外部プログラムを実行するための子プロセスを作成し、メソッドは外部プログラムの結果のみを返します。この方法は、外部プログラムに出力結果がない状況に適しています。
import os
os.system('ls')
commands.getstatusoutput
コマンドモジュールのgetoutputメソッドを使用します。このメソッドとpopendの違いは、popenがファイルハンドルを返すのに対し、このメソッドは外部プログラムの出力結果を文字列として返すため、多くの場合、より便利です。
主な方法:
このメソッドは、外部プログラムの出力結果を取得する必要がある場合に非常に役立ちます。たとえば、urllibを使用してWeb APIを呼び出す場合、取得したデータを処理する必要があります。 os.popen(cmd)コマンドの出力を取得するには、read()またはreadlines()を再度呼び出します(a = os.popen(cmd).read()など)。
import os
ls = os.popen('ls')
print ls.read()
commands.getstatusoutput
コマンドモジュールのgetoutputメソッドを使用します。このメソッドとpopendの違いは、popenがファイルハンドルを返すのに対し、このメソッドは外部プログラムの出力結果を文字列として返すため、多くの場合、より便利です。
主な方法:
import commands
commands.getstatusoutput('ls -lt') #戻る(status, output)
subprocess.call
Pythonの公式ドキュメントによると、これらのモジュールを置き換えるためにサブプロセスモジュールが使用されます。 Python-msshに実装された並列sshツールがあります。コードは非常に短いですが、非常に興味深いので、スレッド内のサブプロセスを呼び出して子プロセスを開始します。
from subprocess import call
call(["ls","-l"])
import shlex, subprocess
def shell_command(cmd, timeout):
data ={"rc":False,"timeout":False,"stdout":"","stderr":""}try:
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)try:
outs, errs = process.communicate(timeout=timeout)
data["stdout"]= outs.decode("utf-8")
data["stderr"]= errs.decode("utf-8")
data["rc"]= True
except subprocess.TimeoutExpired :
process.kill()
outs, errs = process.communicate()
data["rc"]= False
data["stdout"]= outs.decode("utf-8")
data["stderr"]="timeout"
data["timeout"]= True
except Exception as e :
data["rc"]= False
data["stderr"]= e
finally:return data
これまで、pythonでのシェル実行の知識ポイントに関するこの記事を紹介しました。関連するpythonシェル実行コンテンツについては、ZaLou.Cnで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後、ZaLou.Cnをさらにサポートしていただければ幸いです。
Recommended Posts