我有以下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