首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python程序运行时获取全局变量

在Python程序运行时获取全局变量
EN

Stack Overflow用户
提问于 2011-03-15 10:43:20
回答 2查看 1.7K关注 0票数 2

我在CentOS 5.5上写了一个Python2.5命令行程序,它已经运行了1天,而且还在运行。现在我想结束这个程序,但是要得到一个全局变量的值。

我在谷歌上做了一些事情。获取全局变量的值的唯一方法似乎是将Python程序附加到GDB

假设全局变量是一个列表,它的名称是resultlist。如何获取它的值?

EN

回答 2

Stack Overflow用户

发布于 2011-03-15 11:35:21

这是可以做到的,但非常棘手,一个错误的移动将导致程序崩溃(或在不确定的状态下丢失)。

您可以使用C函数PyEval_GetGlobals()返回全局变量的字典(就像在Python中调用globals()时一样),然后使用PyObject_Print()将该对象打印到一个文件(最简单的方法是连接stdout )。

您需要运行GDB并将其附加到python实例。然后,在您知道将被调用的函数上设置断点(如果您的程序正在打印输出,则PyObject_Print()可以工作;否则,this page有一些函数可能会被多次调用。),然后,当程序到达断点时,您将需要禁用它,并打印全局变量。

例如,如果我的Python程序的PID为15847:

代码语言:javascript
运行
复制
(gdb) attach 15847
Attaching to process 15847.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ............. done
0x00007fff870b5e52 in select$DARWIN_EXTSN ()
(gdb) break PyObject_Print
Breakpoint 1 at 0x10003d8f4
(gdb) c
Continuing.

下一次你的程序打印东西的时候:

代码语言:javascript
运行
复制
Breakpoint 1, 0x000000010003d8f4 in PyObject_Print ()
(gdb) disable
(gdb) call (int)PyObject_Print((void*)PyEval_GetGlobals())
$1 = 0
(gdb) c
Continuing.

然后,在程序的输出中,您将看到全局字典。

票数 6
EN

Stack Overflow用户

发布于 2011-03-15 10:57:22

恐怕名字对你没多大帮助。因为您没有内置一些打印机制,而您的进程已经在运行,所以您很可能就搞砸了。

如果您知道这些值可能是什么,那么最好的办法就是使用进程内存扫描程序,然后开始胡乱操作。尽管我估计你成功的机会很小,但我很抱歉。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5306959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档