pexpect.spawn
doesn't interpret shell meta characters, but whatever's running inside pexpect (presumably a shell) clearly does:
child = pexpect.spawn('/bin/bash')
child.sendline('echo hello | cat')
pexpect is just passing the string to the child process; it's not interpreting it.