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