I think the note for communicate() just means that you might get MemoryError (or some other exception) if the output is too big. But I agree it is ambiguous. communicate() uses select() on Unix and threads on Windows, so deadlocks should not be possible. > So, what should I use? Use communicate() (on a machine with infinite memory;-)
Well if you're *certain* that the process is only using one stream, then you can just use read/write on that stream. If not, it probably means you have to use either threads or select/poll. This is a known issue with subprocess; there are a few proposals on the tracker about this. See for example.
The problem with memory is more actual for machines with SSD where swap is usually turned off and /tmp files are located on memory disk. Hitting memory limit often means hard reset. My process is pretty generic that uses all streams, and I don't know how to use threads/polls crossplatform way. looks interesting.