2010-01-15 14 views
1

pywin32 확장을 사용하여 Python에서 win32 API에 액세스합니다. 필자는 Python으로 윈도우 프로그래밍을 할 때 새로운데, 나는 POSIX 사람이다. 그래서 나는 골치가 아픈 방식으로 일을하고 있을지 모른다.파이프에서 출력을 얻기 위해 win32file.ReadFile을 사용하는 올바른 방법은 무엇입니까?

win32file.ReadFile 함수를 올바르게 사용하려고하는데 가능한 결과 코드를 해석하는 데 문제가 있습니다.

나는 이런 식으로 함수를 호출 해요 : 내가 시작 자식 프로세스의 출력을 읽고 있어요

result, data = win32file.ReadFile(child_stdout_r, 4096, None) 

. 좋은 데이터를 얻지 만 4096 자보다 파이프에 더 많은 데이터가있을 수 있습니다. (그리고 그냥 임의로 큰 버퍼 크기를 선택하는 대신 차라리이 작업을 수행 할 것입니다.)

4096자가 넘는 경우 읽을 때까지 win32file.ReadFile을 여러 번 실행해야합니다. 파이프. ReadFile을 여러 번 실행해야하는지 여부를 확인하려면 결과 코드를 해석해야합니다.

ActiveState docs는 말할 :

그 결과의 튜플 (HR, 문자열/PyOVERLAPPEDReadBuffer) 시간이 0 또는 ERROR_MORE_DATA ERROR_IO_PENDING 될 수있다.

함수 호출에서 겹쳐진 값을 None으로 설정했기 때문에 PyOVERLAPPEDReadBuffer 항목에 대해 걱정할 필요가 없습니다. (I 유효한 데이터를 얻고 있기 때문에, 나는 내가 옳다 생각합니다.)

내가 시간 결과 변수를 두 가지 문제가 있습니다

  1. 내가 상수 ERROR_MORE_DATA의 값을 찾을 수 없거나을 어디에서나 ERROR_IO_PENDING.
  2. ActiveState 문서는 0이 성공하고 상수가 무엇이든 실패를 나타냅니다. Microsoft docs 상태는 0은 실패를 나타내고 0이 아닌 값은 성공을 나타내며 더 자세히 알려면 GetLastError를 실행해야합니다.

어떻게해야할까요?

추가 할 항목 : 내가 만든 작업 개체에 하위 프로세스를 추가해야하므로 하위 프로세스를 사용하지 않습니다. 목표는 상위 프로세스가 종료 될 경우 모든 하위 프로세스가 즉시 종료되도록하는 것입니다. 작업 개체에 자식 프로세스를 추가하면 작업 개체에 대한 마지막 핸들이 닫힐 때 자식 프로세스가 종료됩니다. 부모가 보유한 핸들은 부모가 종료 할 때 닫힙니다. 이 모든 것은 내가 말할 수있는 한, 하위 프로세스를 사용하지 못하게합니다.

답변

2

는 당신과 동일합니다.래퍼가 기본 API와 약간 다르게 작동하는 것처럼 들립니다. 미안하지만 실제로 해보지 않았습니다. ReadFile을 다음과 같이 정의된다

+0

당신을 사랑한다고 생각합니다. ;-) 감사! – Schof

+0

나는 그것이 나를 위해 처음으로 인정해야합니다. Blush ;-) – jdigital

0

subprocess을 사용하여 프로세스를 시작하십시오. 그것은 당신에게 당신이 다른 응용 프로그램과 이야기하는 데 사용할 수있는 파일과 같은 객체 세트를 줄 것입니다.

Popen 개체의 .terminate() 메서드를 사용하면 2.6 이상을 실행하는 경우 프로세스를 종료 할 수 있습니다. 오류 코드의 경우, winerror.ERROR_MORE_DATA 및 winerror.ERROR_IO_PENDING

은 ActiveState 워드 프로세서의 나의 해석을 시도

+0

부모가 정리할 수있는 경우 자식 프로세스를 죽일 수있는 방법은 많이 있지만 부모가 어떤 이유로 든 죽으면 자식 프로세스를 죽일 필요가 있습니다. Windows 'Unix 's kill -9 "- 어떤 정리 작업도 배제합니다. – Schof

-1

참고 :

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

곳 ... 어떤 창 핸들입니다

hFile = PyHANDLE 

(... 파일, 프로세스, 스레드 수 있습니다)

buffer/bufSize = PyOVERLAPPEDReadBuffer 

문서에 따라 중복되거나 겹치지 않아도 hFile의 내용이 자동으로 할당됩니다.

overlapped=None [=PyOVERLAPPED] 

당신이 원하는 경우 중첩 (버퍼/bufSize buf의) 이상, 여분의 데이터를 취할 추가 객체를 할당 할 수 있지만, 기본적으로이 NULL입니다. -

그래서 당신은 기본적으로 같은 ReadFile을 호출 할 수 있습니다 :

ReadFile(child_stdout_r, 0, None) 

와 객체는 파일 핸들의 전체 내용을 포함하는 할당합니다.

+0

'ReadFile (child_stdout_r, 0, None)'은 파이썬 2.7.9에 빈 문자열을 반환합니다. 이 대답은 잘못되었습니다. –

+0

사실 내 대답을 읽지 못했습니다. 예를 들었습니다. 그 질문에 대한 Python의 버전에 대한 대답은 정확합니다. – efraimip