在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 ZipFile模块详解
Nov 01 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python中函数传参详解
Jul 03 Python
使用Python更换外网IP的方法
Jul 09 Python
详解Django中间件的5种自定义方法
Jul 26 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
python文件目录操作之os模块
May 08 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利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
常用DOM整理
2015/06/16 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
python处理二进制数据的方法
2015/06/03 Python
python对json的相关操作实例详解
2017/01/04 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
制定岗位职责的原则
2013/11/08 职场文书
保密承诺书范文
2014/03/27 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
让生命充满爱观后感
2015/06/08 职场文书
oracle数据库去除重复数据
2022/05/20 Oracle
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL