使用Python的Popen运行cURL会导致与stdout不同的输出结果

3
我有以下 Python 2.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输出:"
$ 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
1个回答

2

这是一个关于Python脚本输出中的PROGRESS METER信息的内容。

来自curl手册:

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默认会显示进度信息,但如果输出是终端,则会禁用它。因此,当您运行Python脚本时,curl的输出不是终端而是被管道传输到您的Python进程中,从而在输出中呈现进度信息。使用选项“-s”可以禁用进度信息并获得相同的输出结果。
curl -v -s https://httpbin.org/get 2>&1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接