サブプロセス —サブプロセス管理
ソースコード: :source: `Lib / subprocess.py`
サブプロセスモジュールを使用すると、新しいプロセスを生成し、それらの入力/出力/エラーパイプに接続して、それらのリターンコードを取得できます。 このモジュールは、いくつかの古いモジュールと機能を置き換えることを目的としています。
サブプロセスモジュールを使用してこれらのモジュールと機能を置き換える方法については、次のセクションを参照してください。
サブプロセスモジュールの使用
サブプロセスを呼び出すための推奨されるアプローチは、処理できるすべてのユースケースに run()関数を使用することです。 より高度なユースケースでは、基盤となる Popen インターフェースを直接使用できます。
run()関数がPython3.5で追加されました。 古いバージョンとの互換性を維持する必要がある場合は、古い高レベルAPI セクションを参照してください。
- subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)
args で説明されているコマンドを実行します。 コマンドが完了するのを待ってから、 CompletedProcess インスタンスを返します。
上記の引数は、以下の頻繁に使用される引数で説明されている最も一般的な引数にすぎません(したがって、省略された署名ではキーワードのみの表記を使用します)。 完全な関数シグネチャは、 Popen コンストラクタのシグネチャとほぼ同じです。この関数への引数のほとんどは、そのインターフェイスに渡されます。 (タイムアウト、入力、チェック、およびキャプチャ出力はそうではありません。)
caption_output がtrueの場合、stdoutとstderrがキャプチャされます。 使用すると、内部 Popen オブジェクトが
stdout=PIPE
およびstderr=PIPE
で自動的に作成されます。 stdout および stderr 引数を capture_output と同時に指定することはできません。 両方のストリームをキャプチャして1つに結合する場合は、 caption_output の代わりにstdout=PIPE
とstderr=STDOUT
を使用してください。timeout 引数が Popen.communicate()に渡されます。 タイムアウトが経過すると、子プロセスは強制終了されて待機します。 TimeoutExpired 例外は、子プロセスが終了した後に再発生します。
input 引数は、 Popen.communicate()に渡され、サブプロセスのstdinに渡されます。 使用する場合は、バイトシーケンス、または encoding または errors が指定されているか、 text がtrueの場合は文字列である必要があります。 使用すると、内部 Popen オブジェクトは
stdin=PIPE
で自動的に作成され、 stdin 引数も使用できません。check がtrueで、プロセスがゼロ以外の終了コードで終了する場合、 CalledProcessError 例外が発生します。 その例外の属性は、引数、終了コード、およびキャプチャされた場合はstdoutとstderrを保持します。
encoding または errors が指定されている場合、または text がtrueの場合、stdin、stdout、およびstderrのファイルオブジェクトは、指定された encodingを使用してテキストモードで開かれます。 およびエラーまたは io.TextIOWrapper のデフォルト。 Universal_newlines 引数は、 text と同等であり、下位互換性のために提供されています。 デフォルトでは、ファイルオブジェクトはバイナリモードで開かれます。
env が
None
でない場合は、新しいプロセスの環境変数を定義するマッピングである必要があります。 これらは、現在のプロセスの環境を継承するデフォルトの動作の代わりに使用されます。 Popen に直接渡されます。例:
バージョン3.5の新機能。
バージョン3.6で変更: エンコーディングおよびエラーパラメーターを追加
バージョン3.7で変更: Universal_newlines のより理解しやすいエイリアスとして、 text パラメーターを追加しました。 caption_output パラメーターを追加しました。
- class subprocess.CompletedProcess
run()からの戻り値で、終了したプロセスを表します。
- args
プロセスの起動に使用される引数。 これはリストまたは文字列の場合があります。
- returncode
子プロセスの終了ステータス。 通常、終了ステータス0は、正常に実行されたことを示します。
負の値
-N
は、子がシグナルN
(POSIXのみ)によって終了したことを示します。
- stdout
子プロセスからキャプチャされたstdout。 バイトシーケンス、または run()がエンコーディング、エラー、またはtext = Trueで呼び出された場合は文字列。
None
stdoutがキャプチャされなかった場合。stderr=subprocess.STDOUT
を使用してプロセスを実行した場合、stdoutとstderrはこの属性で結合され、 stderr はNone
になります。
- stderr
子プロセスからキャプチャされたstderr。 バイトシーケンス、または run()がエンコーディング、エラー、またはtext = Trueで呼び出された場合は文字列。
None
stderrがキャプチャされなかった場合。
- check_returncode()
returncode がゼロ以外の場合は、 CalledProcessError を発生させます。
バージョン3.5の新機能。
- subprocess.DEVNULL
stdin 、 stdout 、または stderr 引数として Popen に使用でき、特殊ファイル osを示す特別な値.devnull が使用されます。
バージョン3.3の新機能。
- subprocess.PIPE
- stdin 、 stdout 、または stderr 引数として Popen に使用でき、標準ストリームへのパイプが必要であることを示す特別な値開かれます。 Popen.communicate()で最も役立ちます。
- subprocess.STDOUT
- Popen の stderr 引数として使用でき、標準エラーが標準出力と同じハンドルに入る必要があることを示す特別な値。
- exception subprocess.SubprocessError
このモジュールからの他のすべての例外の基本クラス。
バージョン3.3の新機能。
- exception subprocess.TimeoutExpired
SubprocessError のサブクラス。子プロセスの待機中にタイムアウトが経過すると発生します。
- cmd
子プロセスを生成するために使用されたコマンド。
- timeout
秒単位のタイムアウト。
- output
run()または check_output()によってキャプチャされた場合の子プロセスの出力。 それ以外の場合は、
None
。
- stdout
stderr との対称性のための出力のエイリアス。
- stderr
run()によってキャプチャされた場合の子プロセスのStderr出力。 それ以外の場合は、
None
。
バージョン3.3の新機能。
バージョン3.5で変更: stdout および stderr 属性が追加されました
- exception subprocess.CalledProcessError
SubprocessError のサブクラス。 check_call()または check_output()によって実行されたプロセスがゼロ以外の終了ステータスを返したときに発生します。
- returncode
子プロセスの終了ステータス。 シグナルが原因でプロセスが終了した場合、これは負のシグナル番号になります。
- cmd
子プロセスを生成するために使用されたコマンド。
- output
run()または check_output()によってキャプチャされた場合の子プロセスの出力。 それ以外の場合は、
None
。
- stdout
stderr との対称性のための出力のエイリアス。
- stderr
run()によってキャプチャされた場合の子プロセスのStderr出力。 それ以外の場合は、
None
。
バージョン3.5で変更: stdout および stderr 属性が追加されました
頻繁に使用される引数
さまざまなユースケースをサポートするために、 Popen コンストラクター(およびコンビニエンス関数)は、多数のオプションの引数を受け入れます。 最も一般的なユースケースでは、これらの引数の多くをデフォルト値のままにしておくことができます。 最も一般的に必要な引数は次のとおりです。
args はすべての呼び出しに必要であり、文字列または一連のプログラム引数である必要があります。 引数のシーケンスを提供することは、モジュールが引数の必要なエスケープと引用を処理できるようにするため、一般的に好まれます(例: ファイル名にスペースを入れるため)。 単一の文字列を渡す場合、 shell は True (以下を参照)である必要があります。そうでない場合、文字列は引数を指定せずに実行するプログラムに名前を付ける必要があります。
stdin 、 stdout 、 stderr は、それぞれ実行プログラムの標準入力、標準出力、標準エラーファイルハンドルを指定します。 有効な値は、 PIPE 、 DEVNULL 、既存のファイル記述子(正の整数)、既存のファイルオブジェクト、および
None
です。 PIPE は、子への新しいパイプを作成する必要があることを示します。 DEVNULL は、特殊ファイル os.devnull が使用されることを示します。None
のデフォルト設定では、リダイレクトは発生しません。 子のファイルハンドルは親から継承されます。 さらに、 stderr は STDOUT にすることができます。これは、子プロセスからのstderrデータを stdout と同じファイルハンドルにキャプチャする必要があることを示します。encoding または errors が指定されている場合、または text ( Universal_newlines とも呼ばれます)がtrueの場合、ファイルオブジェクト stdin [ X151X]、 stdout 、 stderr は、呼び出しで指定された encoding と errors 、またはのデフォルトを使用してテキストモードで開かれます。 X312X] io.TextIOWrapper 。
stdin の場合、入力の行末文字
'\n'
は、デフォルトの行区切り文字 os.linesep に変換されます。 stdout および stderr の場合、出力のすべての行末は'\n'
に変換されます。 詳細については、コンストラクターの newline 引数がNone
の場合の io.TextIOWrapper クラスのドキュメントを参照してください。テキストモードを使用しない場合、 stdin 、 stdout 、および stderr はバイナリストリームとして開かれます。 エンコードまたは行末変換は実行されません。
バージョン3.6の新機能: エンコーディングおよびエラーパラメーターが追加されました。
バージョン3.7の新機能: text パラメーターを universal_newlines のエイリアスとして追加しました。
ノート
ファイルオブジェクト Popen.stdin 、 Popen.stdout 、および Popen.stderr の改行属性は、 Popen.communicate()[によって更新されません。 X159X]メソッド。
shell が
True
の場合、指定されたコマンドはシェルを介して実行されます。 これは、主にほとんどのシステムシェルで提供される拡張制御フローにPythonを使用していて、シェルパイプ、ファイル名ワイルドカード、環境変数の拡張、~
の拡張などの他のシェル機能への便利なアクセスが必要な場合に役立ちます。 ]ユーザーのホームディレクトリに移動します。 ただし、Python自体が多くのシェルのような機能(特に、 glob 、 fnmatch 、 os.walk()、 os)の実装を提供していることに注意してください。 .path.expandvars()、 os.path.expanduser()、および shutil )。バージョン3.3で変更: Universal_newlines が
True
の場合、クラスは [の代わりにエンコーディング locale.getpreferredencoding(False)を使用しますX167X]。 この変更の詳細については、 io.TextIOWrapper クラスを参照してください。
これらのオプションは、他のすべてのオプションとともに、 Popen コンストラクターのドキュメントで詳しく説明されています。
Popenコンストラクタ
このモジュールの基礎となるプロセスの作成と管理は、 Popen クラスによって処理されます。 開発者が便利な関数でカバーされていないあまり一般的でないケースを処理できるように、それは多くの柔軟性を提供します。
- class subprocess.Popen(args, bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
新しいプロセスで子プログラムを実行します。 POSIXでは、クラスは os.execvp()のような動作を使用して子プログラムを実行します。 Windowsでは、クラスはWindows
CreateProcess()
関数を使用します。 Popen の引数は次のとおりです。args は、プログラム引数のシーケンスであるか、単一の文字列またはパスのようなオブジェクトである必要があります。 args がシーケンスの場合、デフォルトでは、実行するプログラムは args の最初の項目です。 args が文字列の場合、解釈はプラットフォームに依存し、以下で説明します。 デフォルトの動作とのその他の違いについては、 shell および executable 引数を参照してください。 特に明記されていない限り、 args をシーケンスとして渡すことをお勧めします。
いくつかの引数をシーケンスとして外部プログラムに渡す例は次のとおりです。
POSIXでは、 args が文字列の場合、その文字列は実行するプログラムの名前またはパスとして解釈されます。 ただし、これは、プログラムに引数を渡さない場合にのみ実行できます。
ノート
特に複雑な場合、シェルコマンドを一連の引数に分割する方法が明確でない場合があります。 shlex.split()は、 args の正しいトークン化を決定する方法を説明できます。
特に、シェル内で空白で区切られたオプション( -input など)と引数( eggs.txt など)は別々のリスト要素に入れられますが、必要な引数は別々のリスト要素になります。シェルで使用される場合の引用符または円記号のエスケープ(スペースを含むファイル名や上記の echo コマンドなど)は、単一のリスト要素です。
Windowsでは、 args がシーケンスの場合、 Windows での引数シーケンスの文字列への変換で説明されている方法で文字列に変換されます。 これは、基になる
CreateProcess()
が文字列を操作するためです。バージョン3.6で変更: shell が
False
であり、 POSIX上のパスのようなオブジェクト。バージョン3.8で変更: shell が
False
であり、 Windows上のバイトとパスのようなオブジェクト。shell 引数(デフォルトは
False
)は、実行するプログラムとしてシェルを使用するかどうかを指定します。 shell がTrue
の場合、 args をシーケンスではなく文字列として渡すことをお勧めします。shell=True
を使用するPOSIXでは、シェルのデフォルトは/bin/sh
です。 args が文字列の場合、文字列はシェルを介して実行するコマンドを指定します。 つまり、文字列は、シェルプロンプトで入力したときとまったく同じようにフォーマットする必要があります。 これには、たとえば、スペースを含むファイル名を引用符で囲んだり、円記号で囲んだりすることが含まれます。 args がシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。 つまり、 Popen は次と同等の機能を果たします。shell=True
を搭載したWindowsでは、COMSPEC
環境変数がデフォルトのシェルを指定します。 Windowsでshell=True
を指定する必要があるのは、実行するコマンドがシェルに組み込まれているときだけです(例: dir または copy )。 バッチファイルまたはコンソールベースの実行可能ファイルを実行するのにshell=True
は必要ありません。ノート
shell=True
を使用する前に、セキュリティに関する考慮事項のセクションをお読みください。bufsize は、stdin / stdout / stderrパイプファイルオブジェクトを作成するときに、 open()関数に対応する引数として提供されます。
0
は、バッファリングされていないことを意味します(読み取りと書き込みは1つのシステムコールであり、shortを返すことができます)1
は、行バッファリングを意味します(universal_newlines=True
の場合、つまりテキストモードでのみ使用可能)その他の正の値は、ほぼそのサイズのバッファーを使用することを意味します
負のbufsize(デフォルト)は、システムのデフォルトであるio.DEFAULT_BUFFER_SIZEが使用されることを意味します。
バージョン3.3.1で変更: bufsize はデフォルトで-1になり、ほとんどのコードが期待する動作に一致するようにデフォルトでバッファリングを有効にします。 Python 3.2.4および3.3.1より前のバージョンでは、デフォルトで
0
に誤って設定されていましたが、これはバッファリングされておらず、短い読み取りが許可されていました。 これは意図的ではなく、ほとんどのコードが期待するPython2の動作と一致しませんでした。executeable 引数は、実行する置換プログラムを指定します。 それはめったに必要とされません。
shell=False
の場合、実行可能ファイルは、 args で指定された実行プログラムを置き換えます。 ただし、元の args は引き続きプログラムに渡されます。 ほとんどのプログラムは、 args で指定されたプログラムをコマンド名として扱います。コマンド名は、実際に実行されるプログラムとは異なる場合があります。 POSIXでは、 args 名は、 ps などのユーティリティの実行可能ファイルの表示名になります。shell=True
の場合、POSIXで executeable 引数は、デフォルトの/bin/sh
の置換シェルを指定します。バージョン3.6で変更: executeable パラメーターは、POSIX上のパスのようなオブジェクトを受け入れます。
バージョン3.8で変更: 実行可能パラメーターは、Windowsでバイトとパスのようなオブジェクトを受け入れます。
stdin 、 stdout 、 stderr は、それぞれ実行プログラムの標準入力、標準出力、標準エラーファイルハンドルを指定します。 有効な値は、 PIPE 、 DEVNULL 、既存のファイル記述子(正の整数)、既存のファイルオブジェクト、および
None
です。 PIPE は、子への新しいパイプを作成する必要があることを示します。 DEVNULL は、特殊ファイル os.devnull が使用されることを示します。None
のデフォルト設定では、リダイレクトは発生しません。 子のファイルハンドルは親から継承されます。 さらに、 stderr は STDOUT にすることができます。これは、アプリケーションからのstderrデータをstdoutと同じファイルハンドルにキャプチャする必要があることを示します。preexec_fn が呼び出し可能オブジェクトに設定されている場合、このオブジェクトは、子が実行される直前に子プロセスで呼び出されます。 (POSIXのみ)
警告
preexec_fn パラメーターは、アプリケーションにスレッドが存在する場合に安全に使用することはできません。 execが呼び出される前に、子プロセスがデッドロックする可能性があります。 あなたがそれを使わなければならないならば、それをささいなことにしてください! 呼び出すライブラリの数を最小限に抑えます。
ノート
子の環境を変更する必要がある場合は、 preexec_fn で行うのではなく、 env パラメーターを使用してください。 start_new_session パラメーターは、以前は preexec_fn を使用して、子でos.setsid()を呼び出す代わりに使用できます。
バージョン3.8で変更: preexec_fn パラメーターはサブインタープリターでサポートされなくなりました。 サブインタープリターでパラメーターを使用すると、 RuntimeError が発生します。 新しい制限は、mod_wsgi、uWSGI、およびその他の組み込み環境にデプロイされるアプリケーションに影響を与える可能性があります。
close_fds がtrueの場合、子プロセスが実行される前に、
0
、1
、および2
を除くすべてのファイル記述子が閉じられます。 それ以外の場合、 close_fds がfalseの場合、ファイル記述子はファイル記述子の継承で説明されているように、継承可能なフラグに従います。Windowsでは、 close_fds がtrueの場合、 STARTUPINFO.lpAttributeList の
handle_list
要素で明示的に渡されない限り、または標準ハンドルによってハンドルが継承されません。リダイレクション。バージョン3.2での変更: close_fds のデフォルトが False から上記の内容に変更されました。
バージョン3.7での変更: Windowsでは、標準ハンドルをリダイレクトするときに、 close_fds のデフォルトが False から True に変更されました。 標準ハンドルをリダイレクトするときに、 close_fds を True に設定できるようになりました。
pass_fds は、親と子の間で開いたままにするファイル記述子のオプションのシーケンスです。 pass_fds を指定すると、 close_fds が True になります。 (POSIXのみ)
バージョン3.2で変更: pass_fds パラメーターが追加されました。
cwd が
None
でない場合、関数は子を実行する前に作業ディレクトリを cwd に変更します。 cwd は、文字列、バイト、またはパスのようなオブジェクトにすることができます。 特に、実行可能パスが相対パスの場合、関数は cwd を基準にして実行可能(または args の最初の項目)を探します。バージョン3.6で変更: cwd パラメーターは、POSIX上のパスのようなオブジェクトを受け入れます。
バージョン3.7で変更: cwd パラメーターは、Windowsでパスのようなオブジェクトを受け入れます。
バージョン3.8で変更: cwd パラメーターは、Windowsでバイトオブジェクトを受け入れます。
restore_signals がtrue(デフォルト)の場合、PythonがSIG_IGNに設定したすべてのシグナルは、execの前の子プロセスでSIG_DFLに復元されます。 現在、これにはSIGPIPE、SIGXFZ、およびSIGXFSZ信号が含まれます。 (POSIXのみ)
バージョン3.2で変更: restore_signals が追加されました。
start_new_session がtrueの場合、setsid()システムコールは、サブプロセスの実行前に子プロセスで行われます。 (POSIXのみ)
バージョン3.2で変更: start_new_session が追加されました。
env が
None
でない場合は、新しいプロセスの環境変数を定義するマッピングである必要があります。 これらは、現在のプロセスの環境を継承するデフォルトの動作の代わりに使用されます。ノート
指定する場合、 env は、プログラムの実行に必要な変数を提供する必要があります。 Windowsでは、サイドバイサイドアセンブリを実行するには、指定された env must に有効な
SystemRoot
が含まれている必要があります。 ]。encoding または errors が指定されている場合、または text がtrueの場合、ファイルオブジェクト stdin 、 stdout 、および[ X134X] stderr は、上記の頻繁に使用される引数で説明されているように、指定されたエンコーディングとエラーを使用してテキストモードで開かれます。 Universal_newlines 引数は、 text と同等であり、下位互換性のために提供されています。 デフォルトでは、ファイルオブジェクトはバイナリモードで開かれます。
バージョン3.6の新機能: エンコーディングおよびエラーが追加されました。
バージョン3.7の新機能: text が universal_newlines のより読みやすいエイリアスとして追加されました。
指定した場合、 startupinfo は STARTUPINFO オブジェクトになり、基になる
CreateProcess
関数に渡されます。 creationflags は、指定されている場合、次のフラグの1つ以上にすることができます。Popenオブジェクトは、 with ステートメントを介してコンテキストマネージャーとしてサポートされます。終了時に、標準のファイル記述子が閉じられ、プロセスが待機されます。
バージョン3.2で変更:コンテキストマネージャーのサポートが追加されました。
バージョン3.6で変更: Popenデストラクタは、子プロセスがまだ実行中の場合に ResourceWarning 警告を発行するようになりました。
バージョン3.8での変更: Popenは、パフォーマンスを向上させるために os.posix_spawn()を使用できる場合があります。 Windows Subsystem for LinuxおよびQEMUユーザーエミュレーションで、 os.posix_spawn()を使用するPopenコンストラクターは、プログラムの欠落などのエラーで例外を発生しなくなりましたが、子プロセスはゼロ以外の returncode [で失敗します。 X225X]。
例外
新しいプログラムの実行が開始される前に、子プロセスで発生した例外は、親で再発生します。
発生する最も一般的な例外は OSError です。 これは、たとえば、存在しないファイルを実行しようとしたときに発生します。 アプリケーションは、 OSError 例外に備える必要があります。
Popen が無効な引数で呼び出された場合、 ValueError が発生します。
check_call()および check_output()は、呼び出されたプロセスがゼロ以外の戻りコードを返す場合、 CalledProcessError を発生させます。
call()や Popen.communicate()など、 timeout パラメーターを受け入れるすべての関数とメソッドは、 TimeoutExpired を発生させます。プロセスが終了する前にタイムアウトが期限切れになった場合。
このモジュールで定義されている例外はすべて、 SubprocessError から継承されます。
バージョン3.3の新機能: SubprocessError 基本クラスが追加されました。
セキュリティに関する考慮事項
他のいくつかのpopen関数とは異なり、この実装は暗黙的にシステムシェルを呼び出すことはありません。 これは、シェルメタ文字を含むすべての文字を子プロセスに安全に渡すことができることを意味します。 shell=True
を介してシェルが明示的に呼び出された場合、シェルインジェクションの脆弱性を回避するために、すべての空白とメタ文字が適切に引用されていることを確認するのはアプリケーションの責任です。
shell=True
を使用する場合、 shlex.quote()関数を使用して、シェルコマンドの作成に使用される文字列の空白とシェルメタ文字を適切にエスケープできます。
Popenオブジェクト
Popen クラスのインスタンスには、次のメソッドがあります。
- Popen.poll()
- 子プロセスが終了したかどうかを確認します。 returncode 属性を設定して返します。 それ以外の場合は、
None
を返します。
- Popen.wait(timeout=None)
子プロセスが終了するのを待ちます。 returncode 属性を設定して返します。
timeout 秒後にプロセスが終了しない場合は、 TimeoutExpired 例外を発生させます。 この例外をキャッチして、待機を再試行しても安全です。
ノート
これは、
stdout=PIPE
またはstderr=PIPE
を使用するとデッドロックになり、子プロセスはパイプに十分な出力を生成して、OSパイプバッファーがより多くのデータを受け入れるのを待機するのをブロックします。 パイプを使用する場合は、 Popen.communicate()を使用してそれを回避してください。ノート
この関数は、ビジーループ(非ブロッキング呼び出しと短いスリープ)を使用して実装されます。 非同期待機には asyncio モジュールを使用します。
asyncio.create_subprocess_exec
を参照してください。バージョン3.3で変更: timeout が追加されました。
- Popen.communicate(input=None, timeout=None)
プロセスとの対話:データをstdinに送信します。 ファイルの終わりに達するまで、stdoutおよびstderrからデータを読み取ります。 プロセスが終了するのを待ち、 returncode 属性を設定します。 オプションの input 引数は、子プロセスに送信するデータである必要があります。子にデータを送信しない場合は、
None
である必要があります。 ストリームがテキストモードで開かれた場合、 input は文字列である必要があります。 それ以外の場合は、バイトである必要があります。communicate()は、タプル
(stdout_data, stderr_data)
を返します。 ストリームがテキストモードで開かれた場合、データは文字列になります。 それ以外の場合、バイト。プロセスのstdinにデータを送信する場合は、
stdin=PIPE
を使用してPopenオブジェクトを作成する必要があることに注意してください。 同様に、結果タプルでNone
以外のものを取得するには、stdout=PIPE
またはstderr=PIPE
、あるいはその両方を指定する必要があります。timeout 秒後にプロセスが終了しない場合、 TimeoutExpired 例外が発生します。 この例外をキャッチして通信を再試行しても、出力は失われません。
タイムアウトの期限が切れても子プロセスは強制終了されないため、正常に動作するアプリケーションを適切にクリーンアップするには、子プロセスを強制終了して通信を終了する必要があります。
ノート
読み取られたデータはメモリにバッファリングされるため、データサイズが大きい場合や無制限の場合は、この方法を使用しないでください。
バージョン3.3で変更: timeout が追加されました。
- Popen.send_signal(signal)
シグナルシグナルを子に送信します。
ノート
Windowsでは、SIGTERMは terminate()のエイリアスです。 CTRL_C_EVENTおよびCTRL_BREAK_EVENTは、 CREATE_NEW_PROCESS_GROUP を含む creationflags パラメーターで開始されたプロセスに送信できます。
- Popen.terminate()
- 子供を止めなさい。 POSIX OSでは、メソッドはSIGTERMを子に送信します。 Windowsでは、Win32API関数
TerminateProcess()
が呼び出されて子が停止します。
- Popen.kill()
- 子供を殺します。 POSIX OSでは、関数はSIGKILLを子に送信します。 Windowsでは、 kill()は terminate()のエイリアスです。
次の属性も使用できます。
- Popen.args
Popen に渡されたときの args 引数–一連のプログラム引数または単一の文字列。
バージョン3.3の新機能。
- Popen.stdin
- stdin 引数が PIPE の場合、この属性は open()によって返される書き込み可能なストリームオブジェクトです。 encoding または errors 引数が指定された場合、または Universal_newlines 引数が
True
の場合、ストリームはテキストストリームです。それ以外の場合はバイトです。ストリーム。 stdin 引数が PIPE でない場合、この属性はNone
です。
- Popen.stdout
- stdout 引数が PIPE の場合、この属性は open()によって返される読み取り可能なストリームオブジェクトです。 ストリームから読み取ると、子プロセスからの出力が提供されます。 encoding または errors 引数が指定された場合、または Universal_newlines 引数が
True
の場合、ストリームはテキストストリームです。それ以外の場合はバイトです。ストリーム。 stdout 引数が PIPE でない場合、この属性はNone
です。
- Popen.stderr
- stderr 引数が PIPE の場合、この属性は open()によって返される読み取り可能なストリームオブジェクトです。 ストリームから読み取ると、子プロセスからエラー出力が提供されます。 encoding または errors 引数が指定された場合、または Universal_newlines 引数が
True
の場合、ストリームはテキストストリームです。それ以外の場合はバイトです。ストリーム。 stderr 引数が PIPE でない場合、この属性はNone
です。
警告
.stdin.write 、 .stdout.read 、 .stderr.read ではなく、 communicate()を使用して、デッドロックを回避します。他のOSパイプバッファがいっぱいになり、子プロセスをブロックします。
- Popen.pid
子プロセスのプロセスID。
shell 引数を
True
に設定した場合、これは生成されたシェルのプロセスIDであることに注意してください。
- Popen.returncode
poll()および wait()によって(および communication()によって間接的に)設定される子の戻りコード。
None
値は、プロセスがまだ終了していないことを示します。負の値
-N
は、子がシグナルN
(POSIXのみ)によって終了したことを示します。
WindowsPopenヘルパー
STARTUPINFO クラス以降の定数は、Windowsでのみ使用できます。
- class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)
Popen の作成には、Windows STARTUPINFO 構造の部分的なサポートが使用されます。 以下の属性は、キーワードのみの引数として渡すことで設定できます。
バージョン3.7で変更:キーワードのみの引数のサポートが追加されました。
- dwFlags
プロセスがウィンドウを作成するときに特定の STARTUPINFO 属性を使用するかどうかを決定するビットフィールド。
- hStdInput
dwFlags が STARTF_USESTDHANDLES を指定している場合、この属性はプロセスの標準入力ハンドルです。 STARTF_USESTDHANDLES が指定されていない場合、標準入力のデフォルトはキーボードバッファです。
- hStdOutput
dwFlags が STARTF_USESTDHANDLES を指定している場合、この属性はプロセスの標準出力ハンドルです。 それ以外の場合、この属性は無視され、標準出力のデフォルトはコンソールウィンドウのバッファです。
- hStdError
dwFlags が STARTF_USESTDHANDLES を指定している場合、この属性はプロセスの標準エラーハンドルです。 それ以外の場合、この属性は無視され、標準エラーのデフォルトはコンソールウィンドウのバッファです。
- wShowWindow
dwFlags が STARTF_USESHOWWINDOW を指定する場合、この属性は、 ShowWindow 関数の
nCmdShow
パラメーターで指定できる任意の値にすることができます。SW_SHOWDEFAULT
の場合。 それ以外の場合、この属性は無視されます。この属性には SW_HIDE が用意されています。 Popen が
shell=True
で呼び出されたときに使用されます。
- lpAttributeList
STARTUPINFOEX
に記載されているプロセス作成用の追加属性の辞書。 UpdateProcThreadAttribute を参照してください。サポートされている属性:
- handle_list
継承されるハンドルのシーケンス。 close_fds は、空でない場合はtrueである必要があります。
ハンドルは、 Popen コンストラクターに渡されるときに、 os.set_handle_inheritable()によって一時的に継承可能にする必要があります。そうしないと、 OSError がWindowsエラー [で発生します。 X196X](87)。
警告
マルチスレッドプロセスでは、 os.system()などのすべてのハンドルを継承する他のプロセス作成関数への同時呼び出しとこの機能を組み合わせるときに、継承可能とマークされたハンドルがリークしないように注意してください。 これは、継承可能なハンドルを一時的に作成する標準のハンドルリダイレクトにも当てはまります。
バージョン3.7の新機能。
Windows定数
サブプロセスモジュールは、次の定数を公開します。
- subprocess.STD_INPUT_HANDLE
- 標準の入力デバイス。 最初は、これはコンソール入力バッファー
CONIN$
です。
- subprocess.STD_OUTPUT_HANDLE
- 標準出力デバイス。 最初は、これはアクティブなコンソール画面バッファー
CONOUT$
です。
- subprocess.STD_ERROR_HANDLE
- 標準エラーデバイス。 最初は、これはアクティブなコンソール画面バッファー
CONOUT$
です。
- subprocess.SW_HIDE
- ウィンドウを非表示にします。 別のウィンドウがアクティブになります。
- subprocess.STARTF_USESTDHANDLES
- STARTUPINFO.hStdInput 、 STARTUPINFO.hStdOutput 、および STARTUPINFO.hStdError 属性に追加情報が含まれることを指定します。
- subprocess.STARTF_USESHOWWINDOW
- STARTUPINFO.wShowWindow 属性に追加情報が含まれることを指定します。
- subprocess.CREATE_NEW_CONSOLE
- 新しいプロセスには、親のコンソール(デフォルト)を継承する代わりに、新しいコンソールがあります。
- subprocess.CREATE_NEW_PROCESS_GROUP
Popen
creationflags
パラメーターは、新しいプロセスグループが作成されることを指定します。 このフラグは、サブプロセスで os.kill()を使用するために必要です。CREATE_NEW_CONSOLE が指定されている場合、このフラグは無視されます。
- subprocess.ABOVE_NORMAL_PRIORITY_CLASS
Popen
creationflags
パラメーターは、新しいプロセスの優先度が平均より高くなることを指定します。バージョン3.7の新機能。
- subprocess.BELOW_NORMAL_PRIORITY_CLASS
Popen
creationflags
パラメーターは、新しいプロセスの優先度が平均より低くなることを指定します。バージョン3.7の新機能。
- subprocess.HIGH_PRIORITY_CLASS
Popen
creationflags
パラメーターは、新しいプロセスの優先度が高くなることを指定します。バージョン3.7の新機能。
- subprocess.IDLE_PRIORITY_CLASS
Popen
creationflags
パラメーターは、新しいプロセスの優先度がアイドル(最低)になることを指定します。バージョン3.7の新機能。
- subprocess.NORMAL_PRIORITY_CLASS
Popen
creationflags
パラメーターは、新しいプロセスが通常の優先順位を持つことを指定します。 (ディフォルト)バージョン3.7の新機能。
- subprocess.REALTIME_PRIORITY_CLASS
Popen
creationflags
パラメーターは、新しいプロセスがリアルタイムの優先順位を持つことを指定します。 REALTIME_PRIORITY_CLASSを使用することはほとんどありません。これは、マウス入力、キーボード入力、およびバックグラウンドディスクフラッシュを管理するシステムスレッドを中断するためです。 このクラスは、ハードウェアと直接「通信」するアプリケーションや、中断を制限する必要のある短いタスクを実行するアプリケーションに適しています。バージョン3.7の新機能。
- subprocess.CREATE_NO_WINDOW
Popen
creationflags
パラメーターは、新しいプロセスがウィンドウを作成しないことを指定します。バージョン3.7の新機能。
- subprocess.DETACHED_PROCESS
Popen
creationflags
パラメーターは、新しいプロセスがその親のコンソールを継承しないことを指定します。 この値はCREATE_NEW_CONSOLEでは使用できません。バージョン3.7の新機能。
- subprocess.CREATE_DEFAULT_ERROR_MODE
Popen
creationflags
パラメーターは、新しいプロセスが呼び出し元プロセスのエラーモードを継承しないことを指定します。 代わりに、新しいプロセスはデフォルトのエラーモードを取得します。 この機能は、ハードエラーを無効にして実行するマルチスレッドシェルアプリケーションで特に役立ちます。バージョン3.7の新機能。
- subprocess.CREATE_BREAKAWAY_FROM_JOB
Popen
creationflags
パラメーターは、新しいプロセスがジョブに関連付けられていないことを指定します。バージョン3.7の新機能。
古い高レベルAPI
Python 3.5より前は、これら3つの関数はサブプロセスへの高レベルAPIで構成されていました。 多くの場合、 run()を使用できるようになりましたが、既存のコードの多くはこれらの関数を呼び出します。
- subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)
args で説明されているコマンドを実行します。 コマンドが完了するのを待ってから、 returncode 属性を返します。
stdoutまたはstderrをキャプチャする必要があるコードは、代わりに run()を使用する必要があります。
stdoutまたはstderrを抑制するには、 DEVNULL の値を指定します。
上に示した議論は、いくつかの一般的なものにすぎません。 完全な関数シグネチャは、 Popen コンストラクターのシグネチャと同じです。この関数は、 timeout 以外の提供されたすべての引数をそのインターフェイスに直接渡します。
ノート
この機能で
stdout=PIPE
またはstderr=PIPE
を使用しないでください。 パイプが読み取られていないため、OSパイプバッファをいっぱいにするのに十分な出力がパイプに生成されると、子プロセスはブロックされます。バージョン3.3で変更: timeout が追加されました。
- subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)
引数を指定してコマンドを実行します。 コマンドが完了するのを待ちます。 戻りコードがゼロの場合は戻り、そうでない場合は CalledProcessError を発生させます。 CalledProcessError オブジェクトには、 returncode 属性に戻りコードがあります。
stdoutまたはstderrをキャプチャする必要があるコードは、代わりに run()を使用する必要があります。
stdoutまたはstderrを抑制するには、 DEVNULL の値を指定します。
上に示した議論は、いくつかの一般的なものにすぎません。 完全な関数シグネチャは、 Popen コンストラクターのシグネチャと同じです。この関数は、 timeout 以外の提供されたすべての引数をそのインターフェイスに直接渡します。
ノート
この機能で
stdout=PIPE
またはstderr=PIPE
を使用しないでください。 パイプが読み取られていないため、OSパイプバッファをいっぱいにするのに十分な出力がパイプに生成されると、子プロセスはブロックされます。バージョン3.3で変更: timeout が追加されました。
- subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs)
引数を指定してコマンドを実行し、その出力を返します。
戻りコードがゼロ以外の場合、 CalledProcessError が発生します。 CalledProcessError オブジェクトは、 returncode 属性に戻りコードを持ち、 output 属性にすべての出力を持ちます。
これは次と同等です。
上に示した議論は、いくつかの一般的なものにすぎません。 完全な関数シグネチャは、 run()のシグネチャとほぼ同じです。ほとんどの引数は、そのインターフェイスに直接渡されます。 run()の動作からのAPIの逸脱が1つ存在します。
input=None
を渡すと、input=b
(または他の引数によってはinput=
)と同じように動作します。親の標準入力ファイルハンドルを使用します。デフォルトでは、この関数はデータをエンコードされたバイトとして返します。 出力データの実際のエンコードは、呼び出されるコマンドに依存する可能性があるため、テキストへのデコードは、多くの場合、アプリケーションレベルで処理する必要があります。
この動作は、 text 、 encoding 、 errors 、または Universal_newlines を
True
に設定することでオーバーライドできます。 X155X]頻繁に使用される引数および run()。結果の標準エラーもキャプチャするには、
stderr=subprocess.STDOUT
を使用します。バージョン3.1の新機能。
バージョン3.3で変更: timeout が追加されました。
バージョン3.4で変更: input キーワード引数のサポートが追加されました。
バージョン3.6で変更: エンコーディングおよびエラーが追加されました。 詳細については、 run()を参照してください。
バージョン3.7の新機能: text が universal_newlines のより読みやすいエイリアスとして追加されました。
古い関数をサブプロセスモジュールに置き換える
このセクションで「aがbになる」とは、bをaの代わりに使用できることを意味します。
ノート
このセクションのすべての「a」関数は、実行されたプログラムが見つからない場合、(多かれ少なかれ)サイレントに失敗します。 「b」を置き換えると、代わりに OSError が発生します。
さらに、 check_output()を使用した置換は、要求された操作でゼロ以外の戻りコードが生成された場合、 CalledProcessError で失敗します。 出力は、発生した例外の output 属性として引き続き使用できます。
以下の例では、関連する関数がサブプロセスモジュールからすでにインポートされていることを前提としています。
/ bin / sh シェルコマンド置換の置き換え
になります:
シェルパイプラインの交換
になります:
p2がp1の前に存在する場合、p1がSIGPIPEを受信するには、p2の開始後のp1.stdout.close()
呼び出しが重要です。
または、信頼できる入力の場合、シェル自体のパイプラインサポートを直接使用することもできます。
になります:
os.system()の置き換え
ノート:
- 通常、シェルを介してプログラムを呼び出す必要はありません。
より現実的な例は次のようになります。
os.spawn ファミリーの交換
P_NOWAITの例:
P_WAITの例:
ベクトルの例:
環境の例:
os.popen()、os.popen2()、os.popen3()の置き換え
戻りコードの処理は次のように変換されます。
popen2モジュールからの機能の置き換え
ノート
popen2関数のcmd引数が文字列の場合、コマンドは/ bin / shを介して実行されます。 リストの場合、コマンドは直接実行されます。
popen2.Popen3
とpopen2.Popen4
は、基本的に subprocess.Popen として機能しますが、次の点が異なります。
- Popen は、実行が失敗した場合に例外を発生させます。
- captionstderr 引数は stderr 引数に置き換えられます。
stdin=PIPE
およびstdout=PIPE
を指定する必要があります。- popen2はデフォルトですべてのファイル記述子を閉じますが、すべてのプラットフォームまたは過去のPythonバージョンでこの動作を保証するには、
close_fds=True
を Popen で指定する必要があります。
レガシーシェル呼び出し関数
このモジュールは、2.x commands
モジュールから次のレガシー機能も提供します。 これらの操作は暗黙的にシステムシェルを呼び出し、セキュリティと例外処理の一貫性に関する上記の保証はこれらの関数には有効ではありません。
- subprocess.getstatusoutput(cmd)
シェルで cmd を実行した場合の
(exitcode, output)
を返します。Popen.check_output()
を使用してシェルで文字列 cmd を実行し、2タプル(exitcode, output)
を返します。 ロケールエンコーディングが使用されます。 詳細については、頻繁に使用される引数に関する注記を参照してください。末尾の改行は出力から削除されます。 コマンドの終了コードは、サブプロセスの戻りコードとして解釈できます。 例:
バージョン3.3.4で変更: Windowsサポートが追加されました。
この関数は、Python 3.3.3以前の場合のように、(status、output)ではなく(exitcode、output)を返すようになりました。 exitcodeの値は returncode と同じです。
- subprocess.getoutput(cmd)
シェルで cmd を実行した場合の出力(stdoutおよびstderr)を返します。
getstatusoutput()と同様ですが、終了コードが無視され、戻り値がコマンドの出力を含む文字列である点が異なります。 例:
バージョン3.3.4で変更: Windowsサポートが追加されました
ノート
Windowsで引数シーケンスを文字列に変換する
Windowsでは、 args シーケンスは、次のルール(MS Cランタイムで使用されるルールに対応)を使用して解析できる文字列に変換されます。
- 引数は、スペースまたはタブのいずれかである空白で区切られます。
- 二重引用符で囲まれた文字列は、空白が含まれているかどうかに関係なく、単一の引数として解釈されます。 引用符で囲まれた文字列を引数に埋め込むことができます。
- バックスラッシュが前に付いた二重引用符は、リテラルの二重引用符として解釈されます。
- バックスラッシュは、二重引用符の直前にない限り、文字通りに解釈されます。
- バックスラッシュが二重引用符の直前にある場合、バックスラッシュのすべてのペアはリテラルのバックスラッシュとして解釈されます。 バックスラッシュの数が奇数の場合、ルール3で説明されているように、最後のバックスラッシュは次の二重引用符をエスケープします。