Figured it out. You have to have stdin as well as stdout, and call communicate with a string that ends in a newline, like this:
p = subprocess.Popen("bc", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate('1+1\n')
Where out is the output you want.