我有以下Python2.7代码:

import sys
from subprocess import Popen, PIPE

cmd = "curl -v http://172.23.85.34 2>&1"
p = Popen(cmd, shell=True, stderr=PIPE, stdout=PIPE)
ret = p.wait()
out, err = p.communicate()
sys.stdout.write("Command is:\n" + cmd + "\nOutput:\n" + out)

出于某种原因,当我运行python脚本时得到的输出与直接从bash运行curl -v http://172.23.85.34 2>&1时得到的输出不同。这是什么原因?
Python输出:
Command is:
curl -v http://172.23.85.34 2>&1
Output:
* Rebuilt URL to: http://172.23.85.34/
*   Trying 172.23.85.34...
* TCP_NODELAY set
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 172.23.85.34 (172.23.85.34) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.23.85.34
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 23 Mar 2017 13:35:06 GMT
< Server: Apache/2.4.23 (Unix) OpenSSL/1.0.2g
< Upgrade: h2
< Connection: Upgrade
< Last-Modified: Tue, 20 Dec 2016 09:33:57 GMT
< ETag: "61-54413bc4fb12a"
< Accept-Ranges: bytes
< Content-Length: 97
< Content-Type: text/html
<
{ [97 bytes data]
* Curl_http_done: called premature == 0
100    97  100    97    0     0   5307      0 --:--:-- --:--:-- --:--:--  5388
* Connection #0 to host 172.23.85.34 left intact
<html>
  <body>
    <h1>It works!</h1>
    <img src="Helium.jpg" alt="Helium">
  </body>
</html>

卷曲输出:
$ curl -v http://172.23.85.34 2>&1
* Rebuilt URL to: http://172.23.85.34/
*   Trying 172.23.85.34...
* TCP_NODELAY set
* Connected to 172.23.85.34 (172.23.85.34) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.23.85.34
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 23 Mar 2017 13:37:01 GMT
< Server: Apache/2.4.23 (Unix) OpenSSL/1.0.2g
< Upgrade: h2
< Connection: Upgrade
< Last-Modified: Tue, 20 Dec 2016 09:33:57 GMT
< ETag: "61-54413bc4fb12a"
< Accept-Ranges: bytes
< Content-Length: 97
< Content-Type: text/html
<
<html>
  <body>
    <h1>It works!</h1>
    <img src="Helium.jpg" alt="Helium">
  </body>
</html>
* Curl_http_done: called premature == 0
* Connection #0 to host 172.23.85.34 left intact

最佳答案

python脚本的输出中有PROGRESS METER信息。
来自曼库尔:

PROGRESS METER
   curl normally displays a progress meter during operations, indicating the amount of transferred data, transfer speeds and estimated time left, etc.

   curl displays this data to the terminal by default, so if you invoke curl to do an operation and it is about to write data to the terminal, it  disables  the  progress
   meter as otherwise it would mess up the output mixing progress meter and response data.

简单地说,curl在默认情况下会显示progress info,但如果输出是终端,则禁用它,因此当您运行python脚本时,curl的输出不是终端,而是通过管道传输到python进程,从而在输出中生成progress info
使用选项-s将获得相同的输出以禁用它:
curl -v -s https://httpbin.org/get 2>&1

07-26 09:41
查看更多