转储内存中加载的 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 模块的内容的主要内容,如果未能解决你的问题,请参考以下文章
.NET 进程和 AppDomain 在啥情况下会共享内存中加载的程序集?