在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模块学习 datetime介绍
Aug 27 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 Python
python 安全地删除列表元素的方法
Mar 16 Python
python神经网络ResNet50模型
May 06 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文件读写操作之文件读取方法详解
2011/01/13 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
python如何通过实例方法名字调用方法
2018/03/21 Python
简单谈谈python基本数据类型
2018/09/26 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
如何写一份好的自荐信
2014/01/02 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
超级搞笑检讨书
2014/01/15 职场文书
小学新教师培训方案
2014/02/03 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
小学英语听课心得体会
2016/01/14 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript