从子进程实时捕获标准输出

从子进程实时捕获标准输出,第1张

从子进程实时捕获标准输出

一些经验法则

subprocess

  • 永远不要使用
    shell=True
    。它不必要地调用额外的shell进程来调用您的程序。
  • 调用进程时,参数作为列表传递。sys.argv在python中是一个列表,argv在C中也是如此。因此,您将* * 列表传递给Popen来调用子流程,而不是字符串。
  • 不阅读时不要重定向stderr到a PIPE。
  • stdin不写时不要重定向。
  • 例:
import subprocess, time, os, syscmd = ["rsync.exe", "-vaz", "-P", "source/" ,"dest/"]p = subprocess.Popen(cmd,          stdout=subprocess.PIPE,          stderr=subprocess.STDOUT)for line in iter(p.stdout.readline, b''):    print(">>> " + line.rstrip())

也就是说,当rsync检测到它连接到管道而不是终端时,可能会缓冲其输出。这是默认行为-连接到管道时,程序必须显式刷新stdout以获得实时结果,否则标准C库将缓冲。

要对此进行测试,请尝试运行以下命令:

cmd = [sys.executable, 'test_out.py']

并创建一个test_out.py包含以下内容的文件:

import sysimport timeprint ("Hello")sys.stdout.flush()time.sleep(10)print ("World")

执行该子流程应该会给您“ Hello”,并等待10秒钟后才能给出“ World”。如果上述情况发生在上面的python代码上,而不是发生rsync,则意味着rsync它本身正在缓冲输出,因此您很不走运。

一种解决方案是pty使用类似的方法直接连接到

pexpect



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5630202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存