Python標準ライブラリのサブプロセスパッケージの詳細な紹介

高洛峰
リリース: 2017-03-23 16:51:12
オリジナル
2250 人が閲覧しました

ここでの内容は、Linux プロセスの基本と Linux テキスト ストリームに基づいています。サブプロセス パッケージの主な機能は、外部コマンドとプログラムを実行することです。たとえば、ファイルをダウンロードするには wget を使用する必要があります。 Python で wget プログラムを呼び出しています。この意味では、サブプロセスはシェルと同様に機能します。

サブプロセスと一般的に使用されるカプセル化関数

Python を実行するとき、プロセスを作成して実行します。 「Linux プロセスの基本」で紹介したように、プロセスは子プロセスをフォークし、その子プロセスに別のプログラムを実行させることができます。 Python では、標準ライブラリのサブプロセス パッケージを使用して、サブプロセスをフォークし、外部プログラムを実行します (フォークと実行に関する Linux プロセスの基本を参照)。

サブプロセス パッケージには、サブプロセスを作成するための関数がいくつか定義されています。これらの関数はさまざまな方法でサブプロセスを作成するため、必要に応じてそのうちの 1 つを選択できます。さらに、サブプロセスは、プロセス間でテキスト通信を使用するための標準ストリームとパイプを管理するためのいくつかのツールも提供します。

subprocess パッケージ内の関数を使用して子プロセスを作成する場合は、次の点に注意してください。

1) 子プロセスを作成した後、親プロセスが一時停止され、子プロセスの実行を待機するかどうか。

2) 関数は何を返しますか?

3) リターンコードが 0 ではない場合、親プロセスはそれをどのように処理しますか。

subprocess.call()
ログイン後にコピー



親プロセスは子プロセスが完了するのを待ちます

終了情報を返します(リターンコード、終了コードと同等、Linuxプロセスの基本を参照)

subprocess.check_call()
ログイン後にコピー


親プロセスは子プロセスが完了するのを待ちます

Return 0

終了情報を確認します。returncode が 0 でない場合、エラー subprocess.CalledProcessError が発生します。このオブジェクトには returncode 属性が含まれており、try...excel... で確認できます (Python エラー処理を参照)。 。

subprocess.check_output()
ログイン後にコピー



親プロセスは子プロセスの完了を待ちます

子プロセスの出力結果を標準出力に返します

リターンコードが0でない場合はエラーsubprocess.CalledProcessErrorを発生させます。このオブジェクトにはreturncode属性とoutput属性が含まれており、output属性は標準出力の出力結果であり、try...excel....で確認できます。

これら 3 つの関数の使用法は似ています。説明するために subprocess.call() を使用します。

import subprocess
rc = subprocess.call(["ls","-l"])
ログイン後にコピー



プログラム名 (ls) とパラメーター (-l) をテーブルに置きます。 subprocess.call に渡されます。 ()

文字列全体はシェルによって解釈できます:

import subprocess
out = subprocess.call("ls -l", shell=True)
out = subprocess.call("cd ..", shell=True)
ログイン後にコピー



shell=True パラメータを使用しました。今回は、テーブルの代わりに文字列全体を使用して子プロセスを実行します。 Python は最初にシェルを実行し、次にこのシェルを使用して文字列全体を解釈します。

一部のシェル コマンドは、シェルの組み込みコマンドです。これらのコマンドは、シェル $cd を通じて実行する必要があります。 shell=True を指定すると、そのようなコマンドを実行できるようになります。

Popen()

実際、上記の 3 つの関数はすべて Popen() に基づくラッパーです。これらのカプセル化の目的は、サブプロセスの使用を容易にすることです。ニーズに合わせてさらにカスタマイズしたい場合は、子プロセスを表すオブジェクトを生成する Popen クラスを使用します。

上記のカプセル化とは異なり、Popen オブジェクトの作成後、メイン プログラムはサブプロセスの完了を自動的に待ちません。親プロセスが待機する (つまり、ブロックをブロックする) ように、オブジェクトの wait() メソッドを呼び出す必要があります。

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
print("parent process")
ログイン後にコピー



実行結果からわかるように、親プロセスは、子プロセスを開始した後に子の完了を確認しますが、直接 print を実行します。

待機状況を比較します:

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
child.wait()
print("parent process")
ログイン後にコピー



さらに、上記の例の子オブジェクトなど、親プロセス内の子プロセスに対して他の操作を実行することもできます:

child.poll()      # 检查子进程状态

child.kill()      # 终止子进程

child.send_signal()  # 向子进程发送信号

child.terminate()   # 终止子进程
ログイン後にコピー


子プロセスは child .pid に格納されます

子プロセスのテキストフロー制御

(子プロセスから継承) 子プロセスの標準入力、標準出力、標準エラーは以下の属性でも表すことができます:

child.stdin

child.stdout

child.stderr

Popen() が子プロセスを作成するときに、標準入力、標準出力、標準エラーを変更でき、入力とプロセスを接続するために subprocess.PIPE を使用できます。複数の子プロセスをまとめてパイプを形成する出力:

import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)
ログイン後にコピー


subprocess.PIPE は、実際にはテキスト ストリームのバッファーを提供します。 Child1 の stdout はテキストをバッファ領域に出力し、child2 の stdin は PIPE からテキストを読み取ります。 child2 の出力テキストも、communicator() メソッドが PIPE から PIPE 内のテキストを読み取るまで、PIPE に保管されます。

communicator() は Popen オブジェクトのメソッドであり、子プロセスが完了するまで親プロセスをブロックすることに注意してください。

communication() メソッドを使用して、PIPE を使用して子プロセスに入力することもできます:

import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")
ログイン後にコピー


我们启动子进程之后,cat会等待输入,直到我们用communicate()输入"vamei"。

通过使用subprocess包,我们可以运行外部程序。这极大的拓展了Python的功能。如果你已经了解了操作系统的某些应用,你可以从Python中直接调用该应用(而不是完全依赖Python),并将应用的结果输出给Python,并让Python继续处理。shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。

总结

subprocess.call, subprocess.check_call(), subprocess.check_output()

subprocess.Popen(), subprocess.PIPE

Popen.wait(), Popen.communicate()


以上がPython標準ライブラリのサブプロセスパッケージの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート