1

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つの問題があります。

  1. 定数ERROR_MORE_DATAまたはERROR_IO_PENDINGの値がどこにも見つかりません。
  2. ActiveStateのドキュメントは、0が成功であり、定数(それらが何であれ)が失敗を示していることを示唆しているようです。Microsoftのドキュメントによると、0は失敗を示し、ゼロ以外は成功を示します。詳細については、GetLastErrorを実行する必要があります。

これを行う正しい方法は何ですか?

追加するために編集:作成したジョブオブジェクトに子プロセスを追加する必要があるため、サブプロセスを使用していません。目標は、親プロセスが停止した場合に、すべての子プロセスをすぐに停止させることです。子プロセスをジョブオブジェクトに追加することにより、子プロセスは、ジョブオブジェクトへの最後のハンドルが閉じられたときに終了します。親が保持しているハンドルは、親が終了すると閉じられます。私が知る限り、これらすべてがサブプロセスの使用を妨げています。

4

3 に答える 3

3

エラーコードについては、winerror.ERROR_MORE_DATAおよびwinerror.ERROR_IO_PENDINGを試してください

ActiveStateドキュメントの私の解釈はあなたのものと同じです。ラッパーの動作はネイティブAPIとは少し異なるようです。申し訳ありませんが、実際に試したことはありません。

于 2010-01-15T20:59:24.070 に答える
0

subprocessプロセスの起動にを使用することを検討してください。それはあなたが他のアプリと話すために使うことができるファイルのようなオブジェクトのセットをあなたに与えるでしょう。

.terminate()2.6以降を実行している場合は、Popenオブジェクトのメソッドを使用してプロセスを終了できます。

于 2010-01-15T03:43:23.970 に答える
-1

ReadFileは次のように定義されていることに注意してください。

(int, string) = ReadFile(hFile, buffer/bufSize , overlapped)

どこ...

hFile = PyHANDLE

これは任意のウィンドウハンドルです(ファイル、プロセス、スレッドなど)

buffer/bufSize = PyOVERLAPPEDReadBuffer

これは、ドキュメントによると、hFileの内容が重複しているかどうかに関係なく、自動的に割り当てられます。

overlapped=None [=PyOVERLAPPED]

必要に応じて、オーバーラップ(buffer / bufSize)を超えて、追加のオブジェクトを割り当てて追加のデータを取得できますが、デフォルトではこれはNULLです。

つまり、基本的に次のようにReadFileを呼び出すことができます。

ReadFile(child_stdout_r, 0, None)

割り当てるオブジェクトには、ファイルハンドルの全内容が含まれます。

于 2013-09-28T14:30:04.940 に答える