python shellコマンドの呼び出し
3557 ワード
pythonプログラムでshellコマンドを呼び出す
1. os.system(command)
この関数は、サブプロセスを起動し、サブプロセスでcommandを実行し、commandコマンドの実行が完了した後の終了状態を返します.commandに実行内容がある場合は、標準出力に表示されます.これは実際にC標準ライブラリ関数system()を用いて実現される.
欠点:この関数はcommandコマンドを実行するときに端末を再開する必要があり、commandコマンドの実行結果を保存できません.Systemメソッドは、サブプロセス実行外部プログラムを作成し、外部プログラムの実行結果のみを返します.この方法は,外部プログラムが結果を出力していない場合に比較的適している.
例:os.system(‘ls -l *’)
2. os.popen(command,mode)
commandプロセスとの間のパイプを開きます.この関数の戻り値はファイルオブジェクトであり、読み取りまたは書き込みが可能である(modeによって決定され、modeのデフォルトは'r').modeが’r’である場合、この関数の戻り値を使用してread()を呼び出し、commandコマンドの実行結果を取得できます.
os.System(cmd)またはos.popen(cmd)は、前者の戻り値がスクリプトの終了ステータスコードであり、後者の戻り値がスクリプト実行中の出力内容である.実際に使用する場合は、必要に応じて選択します.外部プログラムの出力結果を得る必要がある場合、本方法は非常に有用であり、クラスファイルオブジェクトを返し、そのオブジェクトのread()またはreadline()メソッドを呼び出して出力内容を読み取ることができる.例えばurllibを用いてWeb APIを呼び出す場合,得られたデータを処理する必要がある.os.popen(cmd)コマンドの出力内容を得るには、read()やreadline()などのa=osを呼び出すだけでよい.popen(cmd).read()
例:tmp=os.popen(‘ls -l *’).readlines()
3. commands.getstatusoutput(command)
OSを使用します.popen()関数はcommandコマンドを実行し、commandコマンドの実行の戻り状態と実行結果を表すメタグループ(status,output)を返します.commandの実行は実際には{command;}2>&1の方式なのでoutputにはコンソール出力情報やエラー情報が含まれています.outputには末尾の改行文字は含まれません.commandsモジュールのgetoutputメソッドを使用します.このメソッドとpopendの違いは、popenがクラスファイルオブジェクトを返すことですが、本メソッドは外部プログラムの出力結果を文字列として返すので、より便利に使用することが多いです.
4.subprocessモジュール
Pythonの公式ドキュメントの説明によると、subprocessモジュールは、上記のモジュールの代わりに使用されます.Pythonで実装されたパラレルsshツールであるmsshは、コードが短いが興味深い.スレッドでsubprocess起動サブプロセスを呼び出して動作する.
subprocessはsystemに比べて柔軟である(標準出力、標準エラー、「真」のステータスコード、より良いエラー処理、などを得ることができる).その中のcall()はsystem()に完全に代替され、popen()はより豊富なPopenクラスに代わられている.
まとめ:subprocessを推奨する.run()は一般的な問題を解決する.
subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()はsubprocessを通過する.Popenのカプセル化は高度な関数を実現するので、より複雑な機能が必要な場合はsubprocessを通過することができる.Popenが完成します.runはデフォルトで出力を返さず、コマンドと実行状態のみを返します.Pythonのシステムインタラクション(subprocess)Linuxシステムの下でPythonがシステムShellを呼び出す方法を例に挙げて説明する
1. os.system(command)
この関数は、サブプロセスを起動し、サブプロセスでcommandを実行し、commandコマンドの実行が完了した後の終了状態を返します.commandに実行内容がある場合は、標準出力に表示されます.これは実際にC標準ライブラリ関数system()を用いて実現される.
欠点:この関数はcommandコマンドを実行するときに端末を再開する必要があり、commandコマンドの実行結果を保存できません.Systemメソッドは、サブプロセス実行外部プログラムを作成し、外部プログラムの実行結果のみを返します.この方法は,外部プログラムが結果を出力していない場合に比較的適している.
import os
os.system("echo \"Hello World\"") # os.system echo
Hello World ——————>
0 ——————> What's this ? ?
>>> val = os.system("ls -al | grep \"log\" ") # val
-rw-r--r-- 1 root root 6030829 Dec 31 15:14 log ——————>
>>> print val
0 ——————> , , 0
>>> val = os.system("ls -al | grep \"log1\" ")
>>> print val
256 ——————> os.system , 256~
例:os.system(‘ls -l *’)
2. os.popen(command,mode)
commandプロセスとの間のパイプを開きます.この関数の戻り値はファイルオブジェクトであり、読み取りまたは書き込みが可能である(modeによって決定され、modeのデフォルトは'r').modeが’r’である場合、この関数の戻り値を使用してread()を呼び出し、commandコマンドの実行結果を取得できます.
os.System(cmd)またはos.popen(cmd)は、前者の戻り値がスクリプトの終了ステータスコードであり、後者の戻り値がスクリプト実行中の出力内容である.実際に使用する場合は、必要に応じて選択します.
>>> os.popen('ls -lt') # os.popen(cmd)
>>> print os.popen('ls -lt').read() # read()
total 6064
-rwxr-xr-x 1 long long 23 Jan 5 21:00 hello.sh
-rw-r--r-- 1 long long 147 Jan 5 20:26 Makefile
drwxr-xr-x 3 long long 4096 Jan 2 19:37 test
-rw-r--r-- 1 root root 6030829 Dec 31 15:14 log
drwxr-xr-x 2 long long 4096 Dec 28 09:36 pip_build_long
drwx------ 2 Debian-gdm Debian-gdm 4096 Dec 23 19:08 pulse-gylJ5EL24GU9
drwx------ 2 long long 4096 Jan 1 1970 orbit-long
>>> val = os.popen('ls -lt').read() #
>>> if "log" in val: # in
... print "Haha,there is the log"
... else:
... print "No,not happy"
...
Haha,there is the log
例:tmp=os.popen(‘ls -l *’).readlines()
3. commands.getstatusoutput(command)
OSを使用します.popen()関数はcommandコマンドを実行し、commandコマンドの実行の戻り状態と実行結果を表すメタグループ(status,output)を返します.commandの実行は実際には{command;}2>&1の方式なのでoutputにはコンソール出力情報やエラー情報が含まれています.outputには末尾の改行文字は含まれません.commandsモジュールのgetoutputメソッドを使用します.このメソッドとpopendの違いは、popenがクラスファイルオブジェクトを返すことですが、本メソッドは外部プログラムの出力結果を文字列として返すので、より便利に使用することが多いです.
4.subprocessモジュール
Pythonの公式ドキュメントの説明によると、subprocessモジュールは、上記のモジュールの代わりに使用されます.Pythonで実装されたパラレルsshツールであるmsshは、コードが短いが興味深い.スレッドでsubprocess起動サブプロセスを呼び出して動作する.
args="ls -l"
p=subprocess.Popen(args,shell=True)
subprocessはsystemに比べて柔軟である(標準出力、標準エラー、「真」のステータスコード、より良いエラー処理、などを得ることができる).その中のcall()はsystem()に完全に代替され、popen()はより豊富なPopenクラスに代わられている.
まとめ:subprocessを推奨する.run()は一般的な問題を解決する.
subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()はsubprocessを通過する.Popenのカプセル化は高度な関数を実現するので、より複雑な機能が必要な場合はsubprocessを通過することができる.Popenが完成します.runはデフォルトで出力を返さず、コマンドと実行状態のみを返します.Pythonのシステムインタラクション(subprocess)Linuxシステムの下でPythonがシステムShellを呼び出す方法を例に挙げて説明する