Я хотел бы иметь возможность запускать процесс в python и иметь двухстороннюю связь. Конечно, Pexpect делает это, и я действительно могу пойти. Однако это не совсем идеально.Вопрос подпроцесса Python
Моей идеальной ситуацией было бы иметь кроссплатформенную общую технику, которая включала бы только стандартные библиотеки python. Подпроцесс довольно близок, но тот факт, что мне нужно дождаться завершения процесса, прежде чем безопасно взаимодействовать с ним, нежелательно.
Посмотрите на документацию, он говорит, что есть дескрипторы файлов stdin, stdout и stderr, с которыми я могу напрямую манипулировать, но есть большое толстое предупреждение, в котором говорится: «Do not Do This». К сожалению, не совсем понятно, почему это предупреждение существует, но из того, что я собираю из google, является то, что оно связано с буферизацией os, и можно написать код, который неожиданно блокирует, когда эти внутренние буферы терпят неудачу (в качестве примечания стороны, любые примеры, которые показать неправильный путь, и правильный путь был бы оценен).
Так что, рискуя своим кодом для потенциальных тупиков, я подумал, что было бы интересно использовать опрос или выбрать интерактивное чтение из работающего процесса, не убивая его. Хотя я теряю (я думаю) кросс-платформенную способность, мне нравится тот факт, что он не требует дополнительных библиотек. Но что более важно, я хотел бы знать, действительно ли это хорошая идея. Мне еще предстоит попробовать этот подход, но я обеспокоен ошибками, которые могут привести к разрушению моей программы. Может ли это работать? Что я должен проверить?
В моем конкретном случае я не очень беспокоюсь о возможности писать в процессе, просто повторяя его чтение. Кроме того, я не ожидаю, что мои процессы будут сбрасывать огромное количество текста, поэтому я надеюсь избежать проблемы с блокировкой, однако я хотел бы точно знать, что это за ограничения, и иметь возможность написать несколько тестов, чтобы увидеть, где они ломаются.
Argh! Все мои надежды и мечты, казалось, были подавлены буферизацией stdout!Почему Wont операционная система просто дать мне эти бит: < – Voltaire
вы вызываете некоторые внешние сторонние инструменты, для которых у Python нет модуля/библиотеки? – ghostdog74
В некотором смысле, да. К счастью, они находятся под моим контролем, поэтому у меня есть определенная гибкость в моем решении. Если вызываемый скрипт сбрасывает stdout, я могу работать с ним в интерактивном режиме. В идеале, я хотел бы сделать stdout небуферизованным потоком, но это кажется невозможным. – Voltaire