在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实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
python进行TCP端口扫描的实现
Dec 21 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
python配置grpc环境
Jan 01 Python
用pycharm开发django项目示例代码
Jun 13 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 Python
Python中的socket网络模块介绍
Jul 23 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中对2个数组相加的函数
2011/06/24 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
angular动态表单制作
2018/02/23 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
Python语言描述KNN算法与Kd树
2017/12/13 Python
关于Python的一些学习总结
2018/05/25 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python中判断文件结束符的具体方法
2020/08/04 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
Ajax和javascript的区别
2013/07/20 面试题
开朗女孩的自我评价
2014/02/10 职场文书
课外小组活动总结
2014/08/27 职场文书
2014年营销工作总结
2014/11/22 职场文书
python实现高效的遗传算法
2021/04/07 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers