subprocessソースコード解読
5391 ワード
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 [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')
一般的な関数
subprocess.run()
指定されたコマンドを実行し、実行結果を含むCompletedProcessクラスのインスタンスを返します.
call()
指定したコマンドを実行し、コマンド実行状態に戻ります.
check_call()
指定したコマンドを実行し、実行に成功した場合はステータスコードを返します.そうしないと例外が放出されます.
check_output()
指定したコマンドを実行し、実行ステータスコードが0の場合はコマンド実行結果を返します.そうでない場合は例外を放出します.
getoutput(cmd)
文字列形式のコマンドを受信し、コマンドを実行し、実行結果を返します.
getstatusoutput(cmd)
cmdコマンドを実行し、メタグループ(コマンド実行状態、コマンド実行結果出力)を返します.
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)