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

返回输出之前,Python子进程在后台运行

郎刚捷
2023-03-14
问题内容

我有一些要使用perf调试的Python代码。为此,我想使用子过程。以下命令返回进程的指令相关信息,直到通过Ctrl ^ C退出该命令为止。

perf stat -p <my_pid>

现在,我想在后台在Python代码中运行此代码,直到希望终止它的操作并输出命令输出为止。为了表明我的意思:

x = subprocess.call(["perf","stat","-p",str(GetMyProcessID())])

.. CODE TO DEBUG ..

print x   # I want to terminate subprocess here and output 'x'

现在,我想确定在“ print x”行要做什么以终止该过程并检查输出。任何想法/帮助表示赞赏。

欢呼和感谢,


问题答案:

首先:我建议不要perf在您的python进程中进行调用(如您在下面的任务的复杂性中所看到的),而是使用从命令行进行:

sudo perf stat -- python test.py

如果您 真的 想从python中调用perf,那么您将面临一些棘手的问题:

  1. 终止perf并使其输出收集的性能统计信息,您需要向其发送SIGINT信号(尝试使用sudo perf stat -p mypidctrl-\将不打印任何内容,而ctrl-c将打印)
  2. 您需要捕获,stderr因为perf将其输出发送到stderr(至少在我的版本中)
  3. 您需要使用fork()一个进程发送SIGINT,而另一进程在进程终止时读取它的输出。如果没有fork,它将无法正常工作,因为在您执行SIGINT了该perf过程之后,您将无法再从stdin中读取该过程,因为该进程已经消失了,而当您从头stdin开始读取该文件时,直到perf被正确终止,您将无法获得任何输出。

这意味着您将最终获得此python程序:

import subprocess
import os
import signal
import time

perf = subprocess.Popen(['perf', 'stat',  '-p', str(os.getpid())], stderr=subprocess.PIPE)

# <-- your code goes here

if os.fork() == 0:
    # child
    time.sleep(1)  # wait until parent runs `stderr.read()`
    perf.send_signal(signal.SIGINT)
    exit(0)

# parent
print("got perf stats>>{}<<".format(perf.stderr.read().decode("utf-8")))

time.sleep(1)位是丑陋的,它做什么它,它会,但我想它会做的伎俩为99%的情况。它几乎对perf数据没有影响,唯一的影响是对“总运行时间”(*xx seconds time elapsed



 类似资料:
  • 问题内容: 为了从我的Python脚本启动程序,我使用以下方法: 因此,当我启动像这样的过程时我的程序将等待直到该过程完成为止,然后我才能获得程序的完整输出。如果我正在运行需要一段时间才能完成的过程,这将很烦人。 我可以让我的程序通过在循环完成之前轮询过程输出来逐行写过程输出吗? 问题答案: 你可以在命令输出行之后立即使用处理行。这是显示典型用例的完整示例:

  • 问题内容: 我想使用ffmpeg在php中将视频转换为.flv。目前,我正在执行此操作,但是它会挂起浏览器,直到文件上传完毕。我一直在寻找有关如何在后台运行exec()进程的php文档,同时使用返回的PID更新进程。这是我发现的: 我还使用一个技巧来跟踪后台任务是否正在使用返回的PID运行: 我是否想创建一个单独的.php文件,然后从php cli运行以执行以下功能之一?我只需要稍微推动一下即可开

  • 问题内容: 我想在Linux上使用PHP,确定是否成功执行了使用exec()运行的shell命令。我正在使用return_var参数来检查成功的返回值0。这正常工作,直到我需要对必须在后台运行的进程执行相同的操作为止。例如,在以下命令中,$ result返回0: 我故意将重定向放在其中,我不想捕获任何输出。我只想知道命令已成功执行。那有可能吗? 谢谢,布莱恩 问题答案: 我的猜测是,您尝试做的事情

  • 问题内容: 我的目标很简单:启动rsync并不要等待。 Debian上的Python 2.7.9 样例代码: (我之所以注释掉执行命令,只是因为我实际上将所有试验都保留在代码中,以便我知道自己已经做过什么以及尚未完成什么。显然,我会以正确的方式运行脚本行未注释。) 这是怎么回事…我可以在服务器上观看传输,完成传输后,我会在屏幕上看到“完成”字样。 我想发生的是在发出命令并立即开始传输后立即打印“完

  • 问题内容: 在我的父脚本中,我执行以下操作: 在脚本中,我希望大多数日志消息都进入日志文件,但是我希望根据打印条件在控制台上打印一些消息: 但是它正在打印到outfile,我也想在控制台上打印 但这aslso不起作用。任何帮助,将不胜感激! 问题答案: 如果将stdout,stderr重定向,则可以尝试直接打印到控制台: 例:

  • 问题内容: 在运行该行之后,在指令指针返回到调用函数之前,是否可以看到方法的返回值? 我正在调试无法修改的代码 (阅读:不想重新编译第三方库) ,有时它会跳转到我没有源代码的代码,或者return表达式具有使我无法继续工作的副作用只需在“ 显示” 标签中运行表达式即可。 通常在复合语句中使用返回值,因此 Variables 视图将永远不会向我显示该值(因此希望在控件返回到调用函数之前先查看结果)。

  • 我在spark上运行简单查询时遇到了一个问题,如 在蜂巢控制台上,一切都运行良好,但是当我执行时 查询终止时出现以下错误: 版本: 我已经设置:spark.masterhive-site.xml现在我得到:java.util.concurrent.执行异常:java.lang.运行异常:取消客户端'8ffe7ea3-aaf4-456c-ae18-23c572a766c5'。错误:子进程在连接回io

  • 问题内容: 我目前正在使用 我对Python相当陌生,但是它“感觉”到应该有一些api可以让我做类似的事情: 我这样做是为了在知道cmd已经退出的情况下可以执行某些操作(例如,对当前正在运行的外部进程数进行计数) 我以为我可以将子流程包装在将线程与方法结合在一起的类中,但是由于我还没有在Python中完成线程,而且对于API来说这似乎很常见,我想我会尝试先找到一个。 提前致谢 :) 问题答案: 您