转储内存中加载的 Python 模块的内容

Posted

技术标签:

【中文标题】转储内存中加载的 Python 模块的内容【英文标题】:Dump Contents of Python Module loaded in memory 【发布时间】:2010-07-22 23:13:14 【问题描述】:

我运行了 Python REPL 工具并导入了一个 Python 模块。我可以将该模块的内容转储到文件中吗?这可能吗?提前致谢。

【问题讨论】:

【参考方案1】:

你想用什么格式写文件?如果您想要与导入的完全相同的格式,那并不难——但基本上它是通过文件到文件的副本来完成的。例如,如果有问题的模块名为blah,您可以这样做:

>>> import shutil
>>> shutil.copy(blah.__file__, '/tmp/blahblah.pyc')

【讨论】:

如果模块已加载,但该模块的文件已被删除,是否可以复制该模块? 不起作用? import itertools; print itertools.__file__ 得到 AttributeError: 'module' object has no attribute '__file__ 这仅适用于作为文件(源代码或字节码)存在的模块;如果文件从未存在过(而只是作为存在于动态库中的机器代码,或作为链接到 Python 可执行文件的机器代码)或在加载后已被删除,则无法创建(或重新创建)根据内存内容“从头开始”文件。【参考方案2】:

你的意思是这样的吗?

http://www.datamech.com/devan/trypython/trypython.py

我认为这是不可能的,因为这是一个非常受限的环境。__file__ 属性是伪造的,因此不会映射到真实文件

【讨论】:

我正在我机器的控制台上运行 repl。加载模块后,我删除了模块的目录。有没有办法在没有物理文件的情况下复制模块的内容? @Bobby,不,没有办法以这种方式从删除错误中恢复。【参考方案3】:

您可以通过获取对模块对象的引用来开始:

modobject = __import__("modulename")

不幸的是,这些是不可腌制的。您也许可以遍历dir(modobject) 并获得一些很好的信息来捕获错误...或者是dir(modobject) 本身的字符串表示您想要什么?

【讨论】:

以上是关于转储内存中加载的 Python 模块的内容的主要内容,如果未能解决你的问题,请参考以下文章

为啥内存中加载的 DLL 与原始 DLL 文件不完全对应?

.NET 进程和 AppDomain 在啥情况下会共享内存中加载的程序集?

Java 应用程序中加载的类数中可能存在内存泄漏

PyImport_ImportModule,可以从内存中加载模块吗?

Chrome 内存缓存与磁盘缓存

如何从核心转储中分析内存使用情况?