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


Posted in Python onFebruary 22, 2019

接前两篇“运行时查看线程信息”的博客,我在想,既然我可以随时打印线程信息,那么我是不是可以随时打印进程内部的其它信息呢?比如,实时查看一些对象属性等,这样可以帮助我们在不重新启动应用程序的情况下就可以观察进程的执行状态。(这里暂时不考虑那些使用第三方库或工具的情况)

根据这个想法,查看了一下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 相关文章推荐
简单文件操作python 修改文件指定行的方法
May 15 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
Python玩转Excel的读写改实例
Feb 22 Python
Python闭包和装饰器用法实例详解
May 22 Python
通过python 执行 nohup 不生效的解决
Apr 16 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
pytorch学习教程之自定义数据集
Nov 10 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
python3实现Dijkstra算法最短路径的实现
May 12 Python
python运算符之与用户交互
Apr 13 Python
使用Python开发冰球小游戏
Apr 30 Python
Python开启线程,在函数中开线程的实例
Feb 22 #Python
python 多线程串行和并行的实例
Feb 22 #Python
Python OOP类中的几种函数或方法总结
Feb 22 #Python
VSCode Python开发环境配置的详细步骤
Feb 22 #Python
python中logging模块的一些简单用法的使用
Feb 22 #Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 #Python
Python3.6.x中内置函数总结及讲解
Feb 22 #Python
You might like
人大复印资料处理程序_补充篇
2006/10/09 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
php实现快速排序法函数代码
2012/08/27 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
Python正则表达式使用经典实例
2016/06/21 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
安全教育心得体会
2013/12/29 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript