kri*_*itx 4 python linux subprocess
我在程序中的一个函数检查哈希文件的md5sum
def check():
print "checking integrity status.."
md5 = subprocess.Popen(["md5sum", "-c", hashfile],shell=False, stdout=subprocess.PIPE)
#fopen = open(basefile, "r")
for f in md5.stdout.readlines():
fc = f.rstrip("\n")
sys.stdout.write("\rChecking..." + fc)
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
现在发生的事情是整个命令首先执行然后使用md5.stdout.readlines从md5进行循环读取,因此它不是动态的,即我执行命令时没有得到输出....有没有办法我可以在命令执行时获得输出...
修复使用glglgl的答案:
def check():
print "checking integrity status.."
md5 = subprocess.Popen(["md5sum", "-c", hashfile],shell=False, stdout=subprocess.PIPE)
#fopen = open(basefile, "r")
fc = "NULL"
i = 0
for f in iter(md5.stdout.readline, ''):
k = fc
fc = f.rstrip("\n")
if "FAILED" in fc:
print fc
i = i + 1
sys.stdout.write("\rChecking... "+ str(i)+ " " + fc + (' ' * (len(k) - len(fc))) )
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
当然.有几种方法.
首先,您可以使用md5.stdout.read(),但在那里您必须自己进行线分离.
然后,您可以将文件对象md5.stdout作为迭代器进行操作.但似乎存在缓冲问题,即您没有立即获得结果.
然后有可能md5.stdout.readline()反复调用直到它返回''.
在这种情况下,第三种方式是首选; 我建议这样做:
...
for f in iter(md5.stdout.readline, ''):
fc = f.rstrip("\n")
sys.stdout.write("\rChecked " + fc)
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
我也改变了输出文本,因为只有che检查已经完成才有输出.
如果这不是您想要的,而是真正让每个输出单独捕获,您应该切换到第1点.但这使它更复杂.我会考虑一个解决方案,表明它是需要的.
在那里,必须考虑以下几点:
read() 块,所以应该逐字节读取(非常难看).| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |