Я использую расширения pywin32 для доступа к API win32 под Python. Я новичок в программировании Windows на Python - я парень POSIX, поэтому я, возможно, делаю это с костяной манерой.Каков правильный способ использования win32file.ReadFile для получения вывода из канала?
Я пытаюсь правильно использовать функцию win32file.ReadFile, и у меня возникли проблемы с интерпретацией возможных кодов результатов.
Я вызываю функцию, как это:
result, data = win32file.ReadFile(child_stdout_r, 4096, None)
Я читаю вывод из дочернего процесса, который я запускаю. Я получаю хорошие данные, но я обеспокоен тем, что в трубе может быть больше данных, чем 4096 символов. (И я предпочел бы сделать это правильно, вместо того, чтобы просто выбирать произвольно большой размер буфера.)
В случае, если читать более 4096 символов, мне нужно будет запустить win32file.ReadFile несколько раз, пока я не выхожу труба. Чтобы узнать, нужно ли мне несколько раз запускать ReadFile, мне нужно интерпретировать код результата.
ActiveState docs сказать, что:
В результате получается кортеж (ч, строка/PyOVERLAPPEDReadBuffer), где ч может быть 0, ERROR_MORE_DATA или ERROR_IO_PENDING.
Поскольку я устанавливаю перекрываемое значение None в вызове функции, я думаю, мне не нужно беспокоиться о каких-либо материалах PyOVERLAPPEDReadBuffer. (И так как я получаю достоверные данные, я думаю, что я прав.)
У меня есть две проблемы, связанные с результирующей переменной час:
- Я не могу найти значения констант ERROR_MORE_DATA или ERROR_IO_PENDING в любом месте.
- Документы ActiveState, похоже, подразумевают, что 0 является успешным, а константы (независимо от того, что они есть) указывают на сбой. В Microsoft docs указано, что 0 указывает на сбой, отличное от нуля указывает на успех, и вам нужно запустить GetLastError, чтобы узнать больше.
Каков правильный способ сделать это?
EDITED TO ADD: Я не использую подпроцесс, потому что мне нужно добавить дочерний процесс к объекту задания, который я создаю. Цель состоит в том, чтобы все дочерние процессы немедленно умирали, если родительский процесс умирает. Добавив дочерний процесс к объекту задания, дочерний процесс будет завершен, когда последний дескриптор объекта задания будет закрыт. Ручка, удерживаемая родителем, будет закрыта, когда родитель выйдет. Все это, насколько я могу судить, исключает возможность использования подпроцесса.
Я думаю, что люблю тебя, jdigital. ;-) Благодаря! – Schof
Должен признаться, это первый для меня на SO. Blush ;-) – jdigital