繁体   English   中英

如何从Linux上当前正在运行的Python进程访问数据结构?

[英]How to access a data structure from a currently running Python process on Linux?

我有一个长期运行的Python进程,它生成的数据超出了我的计划。 我的结果存储在一个列表中,该列表将在程序完成时进行序列化(腌制)并写入磁盘(如果可以的话)。 但是以这种速度,列表更有可能耗尽所有1GB以上的可用RAM,并且该过程将崩溃,从而丢失该过程中的所有结果。

我计划修改脚本以定期将结果写入磁盘,但是如果可能的话,我想保存当前正在运行的过程的结果。 有什么方法可以从正在运行的进程中获取内存中的数据结构并将其写入磁盘?

我找到了code.interact(),但是由于我的代码中还没有这个钩子,因此对我来说似乎没有用( 偷看正在运行的Python程序的方法 )。

我在Fedora 8上运行Python 2.5。

非常感谢。

沙欣

对于正在运行的程序,您无能为力。 我唯一能想到的就是附加gdb调试器,停止进程并检查内存。 或者,确保将系统设置为保存核心转储,然后使用kill --sigsegv <pid>进程。 然后,您应该能够使用gdb打开核心转储并在闲暇时进行检查。

有一些gdb宏可以让您检查python数据结构并从gdb中执行python代码,但是要使这些宏起作用,您需要已启用调试符号的python编译功能,我怀疑这是您的情况。 首先创建一个核心转储,然后使用符号重新编译python将不起作用,因为所有地址都将与转储中的值发生变化。

这是从gdb内省python的一些链接:

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

或Google搜索“ python gdb”

注意,使用ulimit命令将linux设置为创建coredumps。

ulimit -a将向您显示当前限制设置。

ulimit -c unlimited将启用任何大小的核心转储。

虽然当然不是很漂亮,但是您可以尝试通过proc文件系统访问过程的数据。/ proc / [您的进程的pid]。 proc文件系统存储许多每个进程的信息,例如当前打开的文件指针,内存映射以及不存储的信息。 经过一点挖掘,您也许可以访问所需的数据。

仍然我怀疑您应该宁愿从python内部查看它并进行一些运行时日志记录和调试。

+1非常有趣的问题。

我不知道这对您有多好(特别是因为我不知道您是否会重用程序中的腌制列表),但是我建议这样做:在您写入磁盘时,将列表打印出来标准输出。 当您运行python脚本时(我也在命令行中猜测),将输出重定向到如下文件:

python myScript.py >> logFile. 

这应将所有列表存储在logFile中。 这样,您可以始终查看logFile中的内容,并且其中应该具有最新的数据结构(取决于调用print的位置)。

希望这可以帮助

此答案包含有关将gdb附加到python进程的信息,其宏将使您进入该进程的pdb会话。 我自己没有尝试过,但获得20票。 听起来您可能最终会挂起该应用程序,但在您的情况下似乎值得冒险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM