Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取正在更改的输出python子进程_Python - Fatal编程技术网

获取正在更改的输出python子进程

获取正在更改的输出python子进程,python,Python,我正在寻找一种解决方案来读取python子流程中的更改/移动输出。由于某些原因,我不能使用pycurl,我只有二进制文件 显然,这种代码是行不通的: import subprocess p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE) out, err = p.communicate() 你知道我能做些什么来检索旋度数据吗?速度,ETA 更新:我错过了你在寻找速度数据的事实。显然,您可以自己计算,因为您可以在传输之前和之后

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

显然,这种代码是行不通的:

import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()
你知道我能做些什么来检索旋度数据吗?速度,ETA

更新:我错过了你在寻找速度数据的事实。显然,您可以自己计算,因为您可以在传输之前和之后调用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)
您可以使用select获取asnyc输出。 e、 g:

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代码:

$ cat changing_output.sh
#!/usr/bin/env bash

for i in `seq 1 10`; do
  echo $i
  sleep 1
done

如果你注意到他的问题,他想要速度数据。啊,我完全错过了。在这种情况下,我会完全按照我在这段代码中所做的去做,但是在之前和之后调用time.time并自己计算速度。事实上,如果我能像你一样快速地输入,我就可以为你节省一条额外的注释了!谢谢你的回复,我会尽快测试;你真的想要卷曲数据吗?
$ cat changing_output.sh
#!/usr/bin/env bash

for i in `seq 1 10`; do
  echo $i
  sleep 1
done