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

Python-进程运行时不断打印子进程输出

姚昊焱
2023-03-14
问题内容

为了从我的Python脚本启动程序,我使用以下方法:

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise ProcessException(command, exitCode, output)

因此,当我启动像这样的过程时Process.execute("mvn clean install"),我的程序将等待直到该过程完成为止,然后我才能获得程序的完整输出。如果我正在运行需要一段时间才能完成的过程,这将很烦人。

我可以让我的程序通过在循环完成之前轮询过程输出来逐行写过程输出吗?


问题答案:

你可以在命令输出行之后立即使用iter处理行lines = iter(fd.readline, "")。这是显示典型用例的完整示例

from __future__ import print_function # Only Python 2.x
import subprocess

def execute(cmd):
    popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
    for stdout_line in iter(popen.stdout.readline, ""):
        yield stdout_line 
    popen.stdout.close()
    return_code = popen.wait()
    if return_code:
        raise subprocess.CalledProcessError(return_code, cmd)

# Example
for path in execute(["locate", "a"]):
    print(path, end="")


 类似资料:
  • 我正在试图理解如何为多个子进程构建并行计算管道。正如我所看到的,每个子进程块等待前一个代码块运行,而我有一个管道,它对前一个运行没有依赖关系,并且可以并行处理。我想知道这是不是可能的,如果是这样的话,一个示例语法来展示如何做到这一点将是一个很大的帮助!提前道谢。

  • 问题内容: 是否有任何参数或选项可为Python的subprocess.Popen方法设置超时? 像这样: ? 问题答案: 我会建议采取看看类中的模块。我用它来实现超时。 首先,创建一个回调: 然后打开过程: 然后创建一个计时器,该计时器将调用回调,并将过程传递给它。 在程序后面的某个位置,您可能需要添加以下行: 否则,python程序将继续运行,直到计时器运行完毕。 编辑:我被告知, 在和条件之

  • 问题内容: 我正在寻找从python调用shell脚本并使用日志记录将其stdout和stderr写入文件的方法。这是我的代码: 而且我敢肯定,有一种方法可以做到,而无需创建临时文件来存储进程输出。有任何想法吗? 问题答案: 我敢肯定有一种方法可以做到,而无需创建临时文件来存储进程输出 您只需要检查的文档,尤其是有关和的文档: ,并分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为:

  • 问题内容: 这是此问题的后续措施,但是如果我想将参数传递给,如何实时获取输出?这就是我目前拥有的;我也尝试从模块中替换为,这只会导致脚本挂起。 在我不必通过的前一个问题中,建议我使用,没有空间输送任何东西到。 附录:这适用于传输,但是我只能在最后看到输出,并且我想查看传输发生时的详细信息。 问题答案: 为了实时从子流程中获取标准输出,您需要准确确定所需的行为;具体来说,您需要确定是要逐行处理还是逐

  • 问题内容: 我想同时运行许多进程并能够随时输出stdout。我该怎么办?我需要为每个调用运行线程吗? 问题答案: 您可以在一个线程中完成。 假设您有一个脚本可以随机打印行: 而且您想在输出可用后立即收集它,您可以按照@zigg的建议在POSIX系统上 使用: 更具可移植性的解决方案(应在Windows,Linux,OSX上运行)可以为每个进程使用读取器线程,请参阅python中的对子进程的非阻塞读

  • 更新:我发现了一个关键部分,解释了为什么这可能不起作用!我使用了这个系统。放样(out);其中out是到JTextArea的特殊打印流 这是代码,但我遇到的问题是,信息只有在我结束流程后才会打印出来。 电流输出: 这是正确的输出,但是当我结束这个过程时,它只是作为一个大块打印。 有人知道问题是什么吗?如果是的话,你能帮我解释一下为什么会这样吗,提前谢谢你。