python shellコマンドの呼び出し

3557 ワード

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)は、前者の戻り値がスクリプトの終了ステータスコードであり、後者の戻り値がスクリプト実行中の出力内容である.実際に使用する場合は、必要に応じて選択します.
  • 外部プログラムの出力結果を得る必要がある場合、本方法は非常に有用であり、クラスファイルオブジェクトを返し、そのオブジェクトのread()またはreadline()メソッドを呼び出して出力内容を読み取ることができる.例えばurllibを用いてWeb APIを呼び出す場合,得られたデータを処理する必要がある.os.popen(cmd)コマンドの出力内容を得るには、read()やreadline()などのa=osを呼び出すだけでよい.popen(cmd).read()
  • >>> 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を呼び出す方法を例に挙げて説明する