在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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
python模块smtplib学习
May 22 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
python实现排序算法解析
Sep 08 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
如何利用Python实现一个论文降重工具
Jul 09 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遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
php新建文件的方法实例
2019/09/26 PHP
javascript数组去重方法终极总结
2014/06/05 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python开发编码规范
2006/09/08 Python
python搭建微信公众平台
2016/02/09 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
python psutil监控进程实例
2019/12/17 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
《花瓣飘香》教学反思
2014/04/15 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
大一新生检讨书
2014/10/29 职场文书
小班教师个人总结
2015/02/05 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
git中cherry-pick命令的使用教程
2022/06/25 Servers
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技