Python自動化開発学習5-2-subprocessモジュール
5200 ワード
前の授業ではもう一つのモジュールが話していませんでした.
subprocessモジュール
システムコマンドを実行し、サブプロセスを管理します.これらのコマンドの置換osです.システムとos.spawn* .だからできるだけsubprocessを使います.
run()実行コマンド
python3.5の後にsubprocessがありました.run()は、公式に推奨されるシステムコマンドを実行する方法です.nslookupで例を挙げます.
上のshellパラメータは、主にコマンドラインに複数のコマンドがある場合に使用されます.デフォルトでは、リストの最初の要素のみがコマンドとして解析されるため、後にコマンドのパラメータが表示されます.具体的には、Linuxのパイプコマンド:ls-l|grep test
画面出力のみで、コマンドのパラメータと実行結果を含む戻り値を取得することもできます.
関連するコマンドとパラメータはhelp(subprocess.Popen)で見ることができます.なぜなら、下位層はsubprocessを通過しているからです.Popenが実現しました.
runは便利ですが、画面上の出力保存を取得するには、最下位のPopenで実現する必要があります.プログラムの標準出力をstdoutで指定します.
Poll()とwait()の違い
Poll():終了するかどうかを確認し、returncodeプロパティを設定して返します.
wait():終了を待ってreturncodeプロパティを設定して返します.
だからコマンドの実行時間が長い時、wait()はずっと待っていて、poll()は直接戻って、まだ終わっていないなら、Noneに戻ります
pollを使用すると、コマンドを実行して結果を待つと同時にpythonの実行を中断することはなく、いつでもpollでコマンドの実行が完了したかどうかを確認できます.
terminate()プロセスを終了しkill
一定期間実行が完了していない場合は、このプロセスを終了します.最後のパラメータを応答のあるIPに変更し、タイムアウトしないでスムーズに実行できます.
communictae(input=None)
サブプロセスとのインタラクション:stdinにデータを送信し、EOFが受信されるまでstdoutおよびstderrからデータを読みます.サブプロセスの終了を待ちます.オプションのinputがあればbytesタイプです.この関数は、(stdoutdata,stderrdata)というメタグループを返します.
主にインタラクティブなコマンド(nslookup telnetのような):
使用可能なパラメータ: args:shellコマンド.文字列またはシーケンスタイプ(list、メタグループなど) です. bufsize:バッファを指定します.0バッファなし、1行バッファ、その他のバッファサイズ、負のシステムバッファ stdin,stdout,stderr:プログラムの標準入力、出力、エラーハンドル をそれぞれ表す. preexec_fn:Unixプラットフォームでのみ有効で、サブプロセスの実行前に が呼び出される実行可能オブジェクト(callable object)を指定します. close_sfs:windowsプラットフォームの下でclose_fdsがTrueに設定されている場合、新しく作成されたサブプロセスは、親プロセスの入力、出力、エラーパイプを継承しません.だからclose_fdsはTrueに設定され、サブプロセスの標準入力、出力、エラー(stdin,stdout,stderr)にリダイレクトされます. shell:デフォルトFalse、Trueの場合、指定したコマンドはshellで実行を説明します. cwd:サブプロセスを設定するための現在のディレクトリ env:サブプロセスを指定する環境変数.env=Noneの場合、サブプロセスの環境変数は親プロセスから継承されます. universal_newlines:システムによって改行が異なり、True-> の使用に同意 startupinfoとcreateionflagsはwindowsの下で最下位のCreateProcess()関数にのみ有効に渡され、メインウィンドウの外観、プロセスの優先度など、サブプロセスのいくつかの属性を設定するために使用されます.
最後にもう一つの例がありますが、具体的には役に立たないかもしれません.パスワードを自動的に入力するときに遭遇しますが、linuxには単行コマンドもあり、stdinでパスワードを入力する問題を解決します.
授業中に話した後、どこかで使えるものがあるとは思わなかったので、忘れてもいいです.
subprocessモジュール
システムコマンドを実行し、サブプロセスを管理します.これらのコマンドの置換osです.システムとos.spawn* .だからできるだけsubprocessを使います.
run()実行コマンド
python3.5の後にsubprocessがありました.run()は、公式に推奨されるシステムコマンドを実行する方法です.nslookupで例を挙げます.
import subprocess
subprocess.run(["nslookup","www.baidu.com","114.114.114.114"]) #
subprocess.run(["nslookup","www.baidu.com 114.114.114.114"]) #
subprocess.run(["nslookup","-qt=cname","www.baidu.com","114.114.114.114"]) #
subprocess.run("nslookup -qt=cname www.baidu.com 114.114.114.114",shell=True) # , shell True
上のshellパラメータは、主にコマンドラインに複数のコマンドがある場合に使用されます.デフォルトでは、リストの最初の要素のみがコマンドとして解析されるため、後にコマンドのパラメータが表示されます.具体的には、Linuxのパイプコマンド:ls-l|grep test
画面出力のみで、コマンドのパラメータと実行結果を含む戻り値を取得することもできます.
import subprocess
res = subprocess.run(["nslookup","www.baidu.com","114.114.114.114"])
print(res)
print(res.returncode) #
関連するコマンドとパラメータはhelp(subprocess.Popen)で見ることができます.なぜなら、下位層はsubprocessを通過しているからです.Popenが実現しました.
runは便利ですが、画面上の出力保存を取得するには、最下位のPopenで実現する必要があります.プログラムの標準出力をstdoutで指定します.
import subprocess
res = subprocess.Popen(
["nslookup","www.baidu.com","114.114.114.114"],
stdout=subprocess.PIPE) # PIPE
res_read = res.stdout.read() # ,read , read
print(res_read) #
print((res_read).decode("gbk")) # , , windows, gbk
print(res.poll()) # 2 , returncode。 0
print(res.wait())
Poll()とwait()の違い
Poll():終了するかどうかを確認し、returncodeプロパティを設定して返します.
wait():終了を待ってreturncodeプロパティを設定して返します.
だからコマンドの実行時間が長い時、wait()はずっと待っていて、poll()は直接戻って、まだ終わっていないなら、Noneに戻ります
import subprocess,time
res = subprocess.Popen(
["nslookup","www.baidu.com","1.1.1.1"],
stdout=subprocess.PIPE) # ,
#print("wait:",res.wait()) # , wait
while res.poll()==None:
print("poll:",res.poll())
time.sleep(1)
print("end poll",res.poll())
pollを使用すると、コマンドを実行して結果を待つと同時にpythonの実行を中断することはなく、いつでもpollでコマンドの実行が完了したかどうかを確認できます.
terminate()プロセスを終了しkill
import subprocess,time
res = subprocess.Popen(
["nslookup","www.baidu.com","1.1.1.1"],
stdout=subprocess.PIPE) # ,
n = 3
while n>0:
print("poll:",res.poll())
time.sleep(1)
n -= 1
else:
if res.poll() == None:
print(" ")
res.terminate() # ,
print(res.stdout.read()) # ,
一定期間実行が完了していない場合は、このプロセスを終了します.最後のパラメータを応答のあるIPに変更し、タイムアウトしないでスムーズに実行できます.
communictae(input=None)
サブプロセスとのインタラクション:stdinにデータを送信し、EOFが受信されるまでstdoutおよびstderrからデータを読みます.サブプロセスの終了を待ちます.オプションのinputがあればbytesタイプです.この関数は、(stdoutdata,stderrdata)というメタグループを返します.
主にインタラクティブなコマンド(nslookup telnetのような):
import subprocess
p = subprocess.Popen('nslookup',shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) # 、 、
p.stdin.write(b'server 114.114.114.114
') # bytes,
p.stdin.write(b'www.baidu.com
')
p.stdin.write(b'exit
')
res = p.communicate() # write ,
#res = p.communicate(b"exit
") # input , 2
print(res[0].decode("gbk")) #
print(res[1].decode("gbk")) # 。" :"
使用可能なパラメータ:
最後にもう一つの例がありますが、具体的には役に立たないかもしれません.パスワードを自動的に入力するときに遭遇しますが、linuxには単行コマンドもあり、stdinでパスワードを入力する問題を解決します.
import subprocess
# Windows echo, shell=True
echo = subprocess.Popen(["echo","server"],
shell=True,
stdout=subprocess.PIPE)
# echo ,
cmd = subprocess.Popen(["nslookup"],
stdin=echo.stdout,
stdout=subprocess.PIPE)
end_of_pipe = cmd.stdout # cmd, cmd echo
print(end_of_pipe.read()) #
授業中に話した後、どこかで使えるものがあるとは思わなかったので、忘れてもいいです.