我正在寻找一个解决方案来读取python子进程中的“更改”/“移动”输出(cURL是特定的)。由于某些原因,我不能使用pycurl,我只有二进制文件。
显然,这种代码不起作用:
import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()
您是否知道如何检索卷曲数据(速度,ETA,......)?
答案 0 :(得分:0)
更新:我错过了您正在寻找速度数据的事实。您显然可以自己计算,因为您可以在传输之前和之后调用time.time()
,并且可以计算传输的字节数。像这样:
import subprocess
import time
start_time = time.time()
out = subprocess.check_output([
'curl', '--silent', 'http://google.com/'])
end_time = time.time()
bytes_per_sec = len(out)/(end_time-start_time)
答案 1 :(得分:0)
您可以使用select
获取asnyc输出。
e.g:
$ tree
.
├── async_output.py
└── changing_output.sh
py代码:
$ cat async_output.py
from subprocess import PIPE, Popen
#proc = Popen(['curl', 'http://www.baidu.com'], stdin = PIPE, stderr = PIPE, stdout = PIPE)
proc = Popen(['changing_output.sh'], stdin = PIPE, stderr = PIPE, stdout = PIPE)
while proc.poll() == None:
import fcntl
import os
import select
fcntl.fcntl(
proc.stdout.fileno(),
fcntl.F_SETFL,
fcntl.fcntl(proc.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)
fcntl.fcntl(
proc.stderr.fileno(),
fcntl.F_SETFL,
fcntl.fcntl(proc.stderr.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)
while proc.poll() == None:
readx = select.select([proc.stdout.fileno()], [], [], 0.1)[0]
readx_err = select.select([proc.stderr.fileno()], [], [], 0.1)[0]
if readx:
chunk = proc.stdout.read()
print chunk,
elif readx_err:
chunk = proc.stderr.read()
print chunk,
else:
break
proc.wait()
sh code:
$ cat changing_output.sh
#!/usr/bin/env bash
for i in `seq 1 10`; do
echo $i
sleep 1
done