subprocessソースコード解読


subprocessモジュールソースコードの紹介
  • subprocessが新しいプロセスを生成し、input/outputパイプを接続し、リターンコードを取得する方法について説明する.

  • 一般的な関数
    subprocess.run()
    指定されたコマンドを実行し、実行結果を含むCompletedProcessクラスのインスタンスを返します.
    call()
    指定したコマンドを実行し、コマンド実行状態に戻ります.
    check_call()
    指定したコマンドを実行し、実行に成功した場合はステータスコードを返します.そうしないと例外が放出されます.
    check_output()
    指定したコマンドを実行し、実行ステータスコードが0の場合はコマンド実行結果を返します.そうでない場合は例外を放出します.
    getoutput(cmd)
    文字列形式のコマンドを受信し、コマンドを実行し、実行結果を返します.
    getstatusoutput(cmd)
    cmdコマンドを実行し、メタグループ(コマンド実行状態、コマンド実行結果出力)を返します.
  • パラメータ説明
  • args:実行するshellコマンド(文字列シーケンス)shellパラメータ値はTrueであるべきである.
  • shell:shellはTrueで、指定コマンドはshellで実行する.
  • check:Trueであり、コマンドを実行するプロセスが非0状態コードで終了すると、CalledProcessErrorの異常が投げ出す.
  • stdout,stderr:
  • run()関数は、コマンド実行結果の正常およびエラー出力を取得しない.取得するコンテンツにsubprocessを渡す.PIPEは、次に、返されるCompletedProcessクラスインスタンスのstdoutおよびstderr属性によって、または対応するコンテンツをキャプチャすることができる.
  • call()とcheck_call()関数は、コマンド実行状態コードを返す.
  • check_output()は、実行コマンドの結果を返す.結果においてエラー情報を取得する、stderr=subprocessを実行することができる.stdOUT.
  • input:このパラメータ値はバイトシーケンスである.
  • universal_新lines:影響は入力と出力のデータフォーマットである.

  • subprocess.CompletedProcessクラスの紹介は、プロセスが終了した状態情報を示す.属性は次のとおりです.
  • args:プロセスのパラメータをロードする.
  • returncodeサブプロセスの終了状態コード.
  • stdout:サブプロセスから取得されたstdout.1バイトのシーケンスuniversal_の指定newlines=Trueの場合、この属性値は文字列である.
  • stderr:サブプロセスから取得されたstderr.値はバイトシーケンスまたは文字列です.
  • check_returncode():returncodeが0以外の値である場合、このメソッドはCalledProcessError異常を放出します.

  • run()
    
    In [2]: subprocess.run(["ls","-l"])
    -rw-r--r-- 1 liyuanjie liyuanjie 1350 12  15 18:33 wireshark.md
    Out[2]: CompletedProcess(args=['ls', '-l'], returncode=0)

  • In [3]: subprocess.run(["ls","-l","/dev/null"],stdout=subprocess.PIPE)Out[3]: CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 12\xe6\x9c\x88 15 07:51/dev/null')
    
    - call()
    
    In [4]: subprocess.call(['ls','-l'])In [5]: subprocess.call('ls -l',shell=True) In [6]: subprocess.call(['ls','-l'],stdout=subprocess.DEVNULL)Out[6]: 0 In [7]: subprocess.call(['ls','-l','/services'])
    
    - check_call()
    
    In [9]: subprocess.check_call(['ls','-l'])In [10]: subprocess.check_call('ls -l',shell=True) In [11]: subprocess.check_call('ls -l/services',shell=True)
    
    - check_output()
    
    In [12]: ret = subprocess.check_output(['ls','-l'])In[13]:print(ret)はバイトシーケンスを返す.In [14]: ret = subprocess.check_output(['ls','-l'],universal_newlines=True)In[15]:print(ret)は文字列を返す.
    
    - getoutput() getstatusoutput()
    
    In [16]: ret = subprocess.getoutput('ls-l')In[17]:print(ret)が正しい場合:In[18]:retcode,output=subprocess.getstatusoutput('ls-l')In[19]:print(retcode)0 In[20]:print(output)エラーの場合:In[21]:retcode,output=subprocess.getstatusoutput('ls -l/test')In [22]: print(retcode)2 In [23]: print(output)ls: cannot access '/test': No such file or directory

    subprocess.Popen

    . subprocess Popen . subprocess.Popen api .

    • Popen

      • args: shell .
      • bufsize: ,0 ,1 . 。
      • stdin,stdout,stderr: , , 。
      • preexec_fn: .
      • close_fds: True , .
      • shell: shell .
      • cwd: .
      • env: .
      • universal_newlines True , stdin,stdout stderr , 。
    • Popen

      Popen.poll() .
      wait(timeout=None) , .
      communicate() .
      send_signal(signal)
      terminate() .
      kill() .
    • In [25]: p = subprocess.Popen('df -hT',stdout=subprocess.PIPE,shell=True)
      In [26]: print(p.stdout.read())
      
      In [2]: p1 = subprocess.Popen(['df','-Th'],stdout=subprocess.PIPE)
      In [3]: p2 = subprocess.Popen(['grep','dev'],stdin=p1.stdout,stdout=subprocess.PIPE)
      
      In [4]: out,err = p2.communicate()
      In [5]: print(out)