获取更改输出python子进程

时间:2014-01-20 22:27:07

标签: python

我正在寻找一个解决方案来读取python子进程中的“更改”/“移动”输出(cURL是特定的)。由于某些原因,我不能使用pycurl,我只有二进制文件。

显然,这种代码不起作用:

import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()

您是否知道如何检索卷曲数据(速度,ETA,......)?

2 个答案:

答案 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