在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字符串处理的七种技巧
Mar 31 Python
python 换位密码算法的实例详解
Jul 19 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python实现简单生成验证码功能【基于random模块】
Feb 10 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
python安装numpy和pandas的方法步骤
May 27 Python
Django时区详解
Jul 24 Python
Python: 传递列表副本方式
Dec 19 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
python 线程的五个状态
Sep 22 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
15种PHP Encoder的比较
2007/03/06 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
Python中的多行注释文档编写风格汇总
2016/06/16 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
国庆节文艺活动方案
2014/02/03 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
青奥会口号
2014/06/12 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
安全保证书
2015/01/16 职场文书
教师节晚会主持词
2015/06/30 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers