I want to repeatedly send requests to process standard input and receive responses from standard output without calling subprocess mul
It is not safe to assume that the child process will immediately get the complete data you send to its stdin, as buffers can get in the way. If you must hold the file open for further output then you should at least invoke its flush() method.
Furthermore, it is not safe to assume that the child process's output will be immmediately available to you to read. If it does not flush (or close) its output stream then the EOL could be buffered, and if you do nothing to prompt the child process to act further, then your readline() may wait forever. But your program then CAN'T do anything, because it's stuck in readline(). If the child process is built for this then you might get it to work, but otherwise you need to use a safer method, such as subprocess.communicate().
As you observe, it does not work to call communicate() more than once on the same subprocess. That's as you should expect from its documentation: it reads all output until end-of-file, and waits for the subprocess to terminate. To send multiple inputs in this mode, build a string containing all of them, pass it to communicate() and then read all the answers.
Alternatively, if you really need to alternate between writing and reading, and your subprocess is not specifically tooled for that, then it is safer to do the reading and writing in separate threads, without any assumption of the writes and reads interlacing perfectly.