在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提取html文件中的特定数据的实现代码
Mar 24 Python
Python下的Mysql模块MySQLdb安装详解
Apr 09 Python
python实现清屏的方法
Apr 30 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
Python制作简易注册登录系统
Dec 15 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python字典的遍历3种方法详解
Aug 10 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
python实现根据文件格式分类
Oct 31 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
Win 10下Anaconda虚拟环境的教程
May 18 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
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
档案接收函
2014/01/13 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
收款授权委托书
2014/10/02 职场文书
现实表现证明材料
2015/06/19 职场文书
法制工作总结2015
2015/07/23 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers