'Communicate' in Python does not work
Question: I'm trying to write a python program to test a java program that takes input
from stdin using Scanner.

All other posts point to using communicate with popen, but for me it
absolutely does not work. When i run my python program, it just calls popen
and then stops while the java program waits for input. I wrote a print
statement after popen to check. It never prints.

Its very simple. I just want to give this program that waits for input some
input.

here is the code:

    
    
    import os.path, subprocess
    from subprocess import PIPE
    
    p = subprocess.Popen(['java', 'Main'], stdin=PIPE, stdout=PIPE)
    print 'after subprocess' #this never get's printed
    output = p.communicate(input='5 5 4 3 2 1'.encode())[0]
    print output
    


Answer: Without more information (like some sample Java code) it's hard to be sure,
but I'll bet the problem is that the Java code is waiting for a complete line,
and you haven't sent one.

If so, the fix is simple:

    
    
    output = p.communicate(input='5 5 4 3 2 1\n'.encode())[0]
    

* * *

As a side note, why exactly are you calling `encode` on that string? It's
already encoded in whatever character set your source code uses. So, when you
call `encode`, it has to first _decode_ that to Unicode. And then, because you
didn't pass an argument to `encode`, it's going to encode it to your default
character set (`sys.getdefaultencoding()`), which doesn't seem any more likely
to match what the Java code is expecting than what you already have. It's
rarely worth calling `encode` with an argument, and you should almost* never
call it on a `str`, only a `unicode`.

* In case you're wondering, the exception is when you're using a handful of special codecs like `hex` or `gzip`. In Python 3, they decided that the occasional usefulness of those special cases was nowhere near as much as the frequent bug-magnet of calling `encode` on already-encoded strings, so they took it out of the language.

