この記事では、Python のサブプロセス モジュール レベルのメソッドを紹介します (コード付き)。これには一定の参考値があります。必要な友人は参照できます。お役に立てれば幸いです。
subprocess.run()
実行して、args パラメーターで指定された命令が完了するまで待機し、CompletedProcess インスタンスを返します。
パラメータ: (*popenargs、input=None、capture_output=False、timeout=None、check=False、**kwargs)。 input、capture_output、timeout、check を除き、他のパラメーターは Popen コンストラクターのパラメーターと一致します。
capture_output: True に設定すると、stdout と stderr をパイプにリダイレクトすることになり、これ以上 stderr または stdout パラメータを渡すことができなくなり、そうでない場合は例外がスローされます。
Input: 入力パラメータはサブプロセスの標準入力として Popen.communicate() メソッドに渡され、文字列である必要があります (エンコーディングまたはエラー パラメータを指定する必要があるか、テキストがTrue) またはバイト型。 None 以外の入力パラメータは stdin パラメータと一緒に使用できません。そうしないと例外がスローされ、Popen インスタンスの構築に使用される stdin パラメータが subprocess.PIPE として指定されます。
timeout: Popen.communicate() メソッドに渡されます。
check: True に設定すると、プロセスの実行で 0 以外のステータス コードが返された場合に CalledProcessError 例外がスローされます。
# 源码 def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs): if input is not None: if 'stdin' in kwargs: raise ValueError('stdin and input arguments may not both be used.') kwargs['stdin'] = PIPE if capture_output: if ('stdout' in kwargs) or ('stderr' in kwargs): raise ValueError('stdout and stderr arguments may not be used ' 'with capture_output.') kwargs['stdout'] = PIPE kwargs['stderr'] = PIPE with Popen(*popenargs, **kwargs) as process: try: stdout, stderr = process.communicate(input, timeout=timeout) except TimeoutExpired: process.kill() stdout, stderr = process.communicate() raise TimeoutExpired(process.args, timeout, output=stdout, stderr=stderr) except: # Including KeyboardInterrupt, communicate handled that. process.kill() # We don't call process.wait() as .__exit__ does that for us. raise retcode = process.poll() if check and retcode: raise CalledProcessError(retcode, process.args, output=stdout, stderr=stderr) return CompletedProcess(process.args, retcode, stdout, stderr)
python3.5 より前は、call()、check_all()、および checkoutput() の 3 つのメソッドがサブプロセス モジュールの高レベル API を構成していました。
subprocess.call()
実行して、args パラメータで指定された命令が完了するまで待機し、実行ステータス コード (Popen インスタンスの returncode 属性) を返します。
パラメータ: (*popenargs、タイムアウト=なし、**kwargs)。基本的に Popen コンストラクターのパラメーターと同じで、タイムアウトを除くすべてのパラメーターが Popen インターフェイスに渡されます。
call() 関数を呼び出すときは、stdout=PIPE または stderr=PIPE を使用しないでください。子プロセスが OS パイプ バッファを満たすのに十分な出力をパイプに生成すると、子プロセスは読み取りできなくなります。パイプからのデータが流出し、障害の原因となります。
# 源码 def call(*popenargs, timeout=None, **kwargs): with Popen(*popenargs, **kwargs) as p: try: return p.wait(timeout=timeout) except: p.kill() p.wait() raise
subprocess.check_call()
実行して、args パラメーターで指定された命令が完了するまで待機し、ステータス コード 0 を返すか、CalledProcessError 例外をスローします。例外では、実行例外の命令とステータス コードを表示できます。
パラメータ: (*popenargs、**kwargs)。すべてのパラメータは call() 関数に渡されます。
注意事項は call()
# 源码 def check_call(*popenargs, **kwargs): retcode = call(*popenargs, **kwargs) if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd) return 0
subprocess.check_output()
実行して、args パラメータで指定された命令が完了するまで待機し、実行に戻ります。標準出力 (CompletedProcess インスタンスの stdout 属性)、タイプのデフォルトは byte です。バイト エンコーディングは、実行された命令に依存する場合があります。universal_newlines=True を設定すると、string タイプの値を返すことができます。
実行ステータス コードが 0 以外の場合、CalledProcessError 例外がスローされます。
パラメータ: (*popenargs、タイムアウト=なし、**kwargs)。すべての引数は run() 関数に渡されますが、親プロセスの標準入力ファイル ハンドルを継承するために input=None を明示的に渡すことはサポートされていません。
戻り値で標準エラーを取得するには、stderr=subprocess.STDOUT を設定します。標準エラーをパイプ stderr=subprocess.PIPE にリダイレクトし、CalledProcessError 例外の stderr 属性を通じてアクセスすることもできます。
# 源码 def check_output(*popenargs, timeout=None, **kwargs): if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') if 'input' in kwargs and kwargs['input'] is None: # Explicitly passing input=None was previously equivalent to passing an # empty string. That is maintained here for backwards compatibility. kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b'' return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, **kwargs).stdout
サブプロセス モジュールは、python2.x バージョンのコマンド モジュールの関連機能も提供します。
subprocess.getstatusoutput(cmd)
実際に check_output() 関数を呼び出し、シェルで文字列型の cmd 命令を実行し、(exitcode, Output) の形式でタプルを返します。 Output( stderr と stdout を含む) は、ロケール エンコーディングを使用してデコードされ、末尾の改行が削除された文字列です。
# 源码 try: data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT) exitcode = 0 except CalledProcessError as ex: data = ex.output exitcode = ex.returncode if data[-1:] == '\n': data = data[:-1] return exitcode, data
subprocess.getoutput(cmd)
getstatusoutput() と似ていますが、結果は出力のみを返します。
この記事はここで終了しました。その他のエキサイティングなコンテンツについては、PHP 中国語 Web サイトの Python ビデオ チュートリアル 列に注目してください。
以上がPython のサブプロセス モジュール レベルのメソッドの紹介 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。