Pythonでwin32APIにアクセスするためにpywin32拡張機能を使用しています。私はPythonでWindowsプログラミングを行うのは初めてです-私はPOSIXの人です-ですから、私は骨の折れる方法で物事をやっているかもしれません。
win32file.ReadFile関数を正しく使用しようとしていますが、考えられる結果コードの解釈に問題があります。
私はこのような関数を呼び出しています:
result, data = win32file.ReadFile(child_stdout_r, 4096, None)
起動した子プロセスからの出力を読み取っています。良いデータが得られますが、パイプ内に4096文字より多くのデータがあるのではないかと心配しています。(そして、任意に大きなバッファーサイズを選択するのではなく、これを正しく実行したいと思います。)
読み取る文字数が4096を超える場合は、パイプを使い果たすまでwin32file.ReadFileを複数回実行する必要があります。ReadFileを複数回実行する必要があるかどうかを確認するには、結果コードを解釈する必要があります。
ActiveStateのドキュメントには次のように書かれています。
結果は(hr、string / PyOVERLAPPEDReadBuffer)のタプルになります。ここで、hrは0、ERROR_MORE_DATA、またはERROR_IO_PENDINGの場合があります。
関数呼び出しでオーバーラップ値をNoneに設定しているので、PyOVERLAPPEDReadBufferのことを心配する必要はないと思います。(そして、私は有効なデータを取得しているので、私は正しいと思います。)
hr結果変数に2つの問題があります。
- 定数ERROR_MORE_DATAまたはERROR_IO_PENDINGの値がどこにも見つかりません。
- ActiveStateのドキュメントは、0が成功であり、定数(それらが何であれ)が失敗を示していることを示唆しているようです。Microsoftのドキュメントによると、0は失敗を示し、ゼロ以外は成功を示します。詳細については、GetLastErrorを実行する必要があります。
これを行う正しい方法は何ですか?
追加するために編集:作成したジョブオブジェクトに子プロセスを追加する必要があるため、サブプロセスを使用していません。目標は、親プロセスが停止した場合に、すべての子プロセスをすぐに停止させることです。子プロセスをジョブオブジェクトに追加することにより、子プロセスは、ジョブオブジェクトへの最後のハンドルが閉じられたときに終了します。親が保持しているハンドルは、親が終了すると閉じられます。私が知る限り、これらすべてがサブプロセスの使用を妨げています。