Python自動化開発学習5-2-subprocessモジュール


前の授業ではもう一つのモジュールが話していませんでした.
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"))  #  。" :"

使用可能なパラメータ:
  • 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でパスワードを入力する問題を解決します.
    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())  #       

    授業中に話した後、どこかで使えるものがあるとは思わなかったので、忘れてもいいです.