Когда следует использовать `wait` вместо` общаться` в подпроцессе?

В документе wait (http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait) говорится:

Предупреждение

Это будет заторможен при использовании stdout = PIPE и/или stderr = PIPE и дочерний процесс генерирует достаточный выход в канал таким образом, что он блокирует ожидая, когда буфер буфера OS примет больше данных. Использовать связь() чтобы избежать этого.

Из этого, я думаю, communicate может заменить все использование wait(), если retcode не требуется. И даже если stdout или stdin не являются PIPE, я также могу заменить wait() на communicate().

Это правильно? Спасибо!

Ответ 1

Я подозреваю (в документах явно не указано его как 2.6) в случае, когда вы не используете PIPEs, связь() сокращается до wait(). Поэтому, если вы не используете PIPE, для замены wait() должно быть ОК.

В случае, когда вы делаем, используйте PIPE, вы можете переполнять буфер памяти (см. сообщение() (см. сообщение()) так же, как вы можете заполнить буфер буфера OS, так что любой из них не будет работать, если вы "имеет дело с большим количеством результатов.

На практическом замечании, которое я связывал (по крайней мере, в 2.4), давал мне по одному символу в строке из программ, выход которых основан на линии, что было бесполезно, чтобы выразить это мягко.

Также, что вы подразумеваете под "retcode не требуется"? - Я считаю, что он устанавливает Popen.returncode так же, как и wait().