Python运行时动态查看进程内部信息的方法

晚来风
晚来风
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍在Python运行时通过SIGQUIT信号动态查看进程内部信息的方法。无需重启应用,利用信号处理函数动态加载指定模块,即可实时打印对象属性。通过修改动态模块文件并再次触发信号,可实现对进程状态的灵活监控与调试,适用于需要实时观察执行状态的场景。

承接前文关于“运行时查看线程信息”的讨论,本文进一步探讨:既然能够随时打印线程信息,是否也能实时获取进程内部的其他数据?例如,直接查看某些对象的属性。这种方法的优势在于,无需重新启动应用程序,即可观察进程当前的执行状态(此处暂不涉及使用第三方库或工具的情况)。

基于上述思路,我查阅了Python动态加载模块的相关机制,认为该方案具备可行性,并编写了一个小型测试程序进行验证(需说明:此为验证性示例,若应用于生产环境,还需考虑诸多潜在问题)。

在测试过程中,主要考虑实现以下功能点:

- 沿用SIGQUIT信号(即执行“kill -3”命令)来触发进程内部对象属性的打印操作。

- 主程序foo.py负责注册信号处理函数,创建一个全局对象以保存相关属性,并启动一个线程以防止主线程过早退出。

- 在foo.py的信号处理函数中,动态加载位于指定路径下的模块(示例中路径为“/tmp/my_modules”,该路径可根据实际需求调整),随后调用该模块中的方法以打印进程信息。

- 动态加载的模块/tmp/my_modules/bar.py负责访问foo模块中的对象,并打印该对象的属性值。

- 支持随时动态修改要查看的进程状态,即在不重启进程的前提下,通过修改bar.py文件来调整需要查看的内容。

主程序 foo.py

#!/usr/bin/env /usr/bin/python3.4
# -*- coding: utf-8 -*-
import sys
import threading
import signal
from datetime import datetime
import time


class MyObject(object):
  def __init__(self):
    self.data = {}
    self.data['a'] = 'aaa'
    self.data['b'] = 'bbb'
    self.data['c'] = 'ccc'


def test():
  while True:
    print(datetime.now())
    time.sleep(2)

# 信号处理函数
def signal_handler(signum, frame):
  try:
    # 动态加载模块
    sys.path.append("/tmp/my_modules")

    # 导入bar模块
    bar = __import__('bar')

    # 重新加载模块,为的是可以随时重新加载模块
    reload(bar)

    # 调用动态加载模块的方法
    bar.execute()
  except BaseException as e:
    print(e)


my_object = MyObject()

if __name__ == "__main__":
  try:
    signal.signal(signal.SIGQUIT, signal_handler)

    threading.Thread(target=test).start()

    while True:
      time.sleep(60)
  except KeyboardInterrupt:
    sys.exit(1)

需要动态加载的模块 /tmp/my_modules/bar.py

#!/usr/bin/env /usr/bin/python3.4
# -*- coding: utf-8 -*-
import foo


def execute():
  # 打印foo模块中的对象
  print "my_object: %s " % foo.my_object.data

测试

首先运行foo.py

$ python foo.py

接着获取foo.py的进程号,然后使用“kill -3”命令触发打印内存对象的方法

$ kill -3 <pid>

此时应当可以看到foo.py进程打印出my_object的属性。

修改/tmp/my_modules/bar.py文件后,再次执行“$ kill -3 ”,可以看到模块已被重新加载,并打印出更新后的内容。

以上即为在Python运行时动态查看进程内部信息的方法分享,希望能为大家提供参考,也欢迎大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表