If Mathematica doesn't like a redirected stdout then you could try to hoodwink it by providing a pseudo-tty:
import pipes
from pexpect import run # $ pip install pexpect
args = ["./solve.m", Mrefnorm, Mvert, Mcomp, Mangle]
command = " ".join(map(pipes.quote, args))
output, status = run(command, withexitstatus=True)
You could also use stdlib pty
module directly to capture the output.
If you want to get separate stdout/stderr; you could try to workaround the bug mentioned by @Wayne Allen.