在python中运行piped cmd-不同的结果

在python中运行piped cmd-不同的结果,python,command,call,subprocess,pipe,Python,Command,Call,Subprocess,Pipe,我试图在python中调用管道命令(echo-e“HEAD/HTTP/1.0\n”| ncat-C localhost 80) from subprocess import call cmd = 'echo -e "HEAD / HTTP/1.0\n" | ncat -C localhost 80' output=call(cmd, shell=True) print output 然而,结果与预期不同: HTTP/1.1 400 Bad Request ... 预期结果(从shell运行

我试图在python中调用管道命令(echo-e“HEAD/HTTP/1.0\n”| ncat-C localhost 80)

from subprocess import call
cmd = 'echo -e "HEAD / HTTP/1.0\n" |  ncat -C localhost 80'
output=call(cmd, shell=True)
print output
然而,结果与预期不同:

HTTP/1.1 400 Bad Request
...
预期结果(从shell运行cmd时)为:

更新: 我刚刚做了实验,这似乎效果很好

from subprocess import Popen, PIPE
p1 = Popen(['echo', 'HEAD / HTTP/1.0\n'], stdout=PIPE)
p2 = Popen(["ncat", "-C", "localhost", "80"], stdin=p1.stdout)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

您的
\n
正在python字符串中生成一个换行符。我假设你想要
echo
来解释这个。尝试将其设置为原始字符串:

cmd = r'echo -e "HEAD / HTTP/1.0\n" |  ncat -C localhost 80'

这样,python就不会解释'\n',它会被传递。

是的,在考虑过它之后,即使它是一个文字换行符,所以是一个稍微不同的命令,换行符在双引号内,所以它在输出中仍然应该是一个换行符。
cmd = r'echo -e "HEAD / HTTP/1.0\n" |  ncat -C localhost 80'