如何从加载的模块(sys.modules)重建Python源码?

1 投票
2 回答
673 浏览
提问于 2025-04-16 03:07

如果你能访问到sys.modules,能否为加载的模块构建出人类可读的源代码呢?

有人告诉我这是不可能的,但我相信在Python中这是可以做到的。

2 个回答

0

一般来说,源代码会存放在文件系统中,能够很容易地通过sys.modules找到。

for name, mod in sys.modules.items():
    try:
        fname = mod.__file__
    except AttributeError:
        continue
    if fname.endswith(".pyc"):
        fname = fname[:-1]
    try:
        fcode = open(fname)
    except IOError:
        continue
    code = fcode.read()
    # .. do something with name and code
4

你可以使用标准库中的 dis 模块来反汇编一个用Python编写的模块。这会生成一种人类可读的源代码,不过不是 Python 源代码,而是 字节码 源代码。从煎蛋卷重新拼回生鸡蛋可就难多了。

以前有一个针对Python 2.3的反编译工具(可以在 这里 找到),但我不知道这些年有没有人维护它,这说明在开源社区里对这个任务的兴趣不大。如果你有不同的看法,可以把这个项目分叉,创建一个自己的项目,目标是反编译2.7(或者你想反编译的任何Python版本),并吸引其他对这个任务感兴趣的人——当然前提是你能找到他们。

撰写回答