ホームページ  >  記事  >  バックエンド開発  >  Python のサブプロセス モジュール レベルのメソッドの紹介 (コード付き)

Python のサブプロセス モジュール レベルのメソッドの紹介 (コード付き)

不言
不言転載
2019-03-27 09:48:033089ブラウズ

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。