当前位置: 首页 > 面试题库 >

捕获子流程输出

祁柏
2023-03-14
问题内容

我了解到,在Python中执行命令时,应该使用子进程。我想要实现的是通过ffmpeg对文件进行编码,并观察程序输出,直到文件完成。Ffmpeg将进度记录到stderr。

如果我尝试这样的事情:

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
complete = False
while not complete:
    stderr = child.communicate()

    # Get progress
    print "Progress here later"
    if child.poll() is not None:
        complete = True
    time.sleep(2)

调用child.communicate()后,程序无法继续执行,并等待命令完成。还有其他方法可以跟踪输出吗?


问题答案:

communication()阻塞直到子进程返回,所以循环中的其余各行仅在子进程完成运行
才能执行。从stderr读取也将阻止,除非您像这样逐个字符地读取:

import subprocess
import sys
child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
while True:
    out = child.stderr.read(1)
    if out == '' and child.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

这将为您提供实时输出。取自Nadia在这里的答案。

您显然可以使用subprocess.communicate,但我认为您正在寻找实时输入和输出。

readline被阻止,因为该过程可能正在等待您的输入。您可以逐个字符地阅读以克服此问题,如下所示:

import subprocess
import sys

process = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)

while True:
    out = process.stdout.read(1)
    if out == '' and process.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()


 类似资料:
  • 问题内容: 我试图用Python编写程序,并被告知运行.exe文件。运行此.exe文件时,它会吐出大量数据,并且我需要在屏幕上打印出一定的行。我很确定我需要使用或类似的东西,但是我是子处理的新手,没有任何线索。有人有简单的方法让我完成此工作吗? 问题答案: 像这样:

  • 问题内容: 我想在Windows中使用rsync.exe,并在Python中打印标准输出。 我的代码可以运行,但是直到文件传输完成后才能捕获进度!我想实时打印每个文件的进度。 既然我听说使用Python 3.1,现在应该会更好地处理IO。 问题答案: 一些经验法则。 永远不要使用。它不必要地调用额外的shell进程来调用您的程序。 调用进程时,参数作为列表传递。sys.argv在python中是一

  • 问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,

  • 问题内容: 我正在尝试为命令行程序(svnadmin verify)编写包装脚本,该脚本将显示该操作的良好进度指示器。这要求我一看到包装程序的输出,就能够看到它的每一行。 我认为我只是使用, 来执行程序,然后读取其中的每一行并相应地对其进行操作。但是,当我运行以下代码时,输​​出似乎被缓冲在某处,导致它出现在两个块中,第1到332行,然后是333到439行(输出的最后一行) 在稍微了解一下子流程的

  • 问题内容: 我需要一种方法来干扰编写xsl结果文档,以避免将它们写入文件系统。现在我的模板正在写到一个临时目录,然后我压缩该目录。我想用这种方式写到文件系统。我正在使用撒克逊处理器。可以使用仅使用标准Java库的解决方案。任何建议表示赞赏。 编辑: 我发现了.net saxon api的此类http://www.saxonica.com/documentation/dotnetdoc/Saxon/

  • 问题内容: 说我有一个下面的函数,如何捕获Process.spawn调用的输出?如果花费的时间超过指定的超时时间,我也应该能够终止该过程。 请注意,该功能还必须是跨平台的(Windows / Linux)。 谢谢。 问题答案: 您可以使用并告诉使用重定向的输出,而无需外部gem。 当然,仅从Ruby 1.9.2开始(我个人建议1.9.3) 以下是Spinach BDD在内部用于捕获输出和err输出