生成导入图

and*_*tti 5 python import introspection

我正在接近我的最终目标,即在模块和其他导入模块之间生成一个漂亮的图表。

例如,如果 x 从 y 和 z 导入,y 从 t 和 v 导入,我希望:

x -> y, z
y -> t, v
Run Code Online (Sandbox Code Playgroud)

现在我已经定义了导入钩子,如下所示,但是在一个简单的文件上运行它我没有得到我所期望的结果:

python study_imports.py CollectImports simple.py

('study_imports.py', 'study_imports')
Run Code Online (Sandbox Code Playgroud)

simple.py实际上是从study_imports导入的。问题是我想看到“simple.py”而不是“study_imports.py”,有没有办法获取实际导入其他模块的文件的路径?

class CollectImports(object):
    """
    Import hook, adds each import request to the loaded set and dumps
    them to file
    """

    def __init__(self, output_file):
        self.loaded = set()
        self.output_file = output_file

    def __str__(self):
        return str(self.loaded)

    def cleanup(self):
        """Dump the loaded set to file
        """
        dumped_str = '\n'.join(x for x in self.loaded)
        open(self.output_file, 'w').write(dumped_str)

    def find_module(self, module_name, package=None):
        #TODO: try to find the name of the package which is actually
        #importing something else, and how it's doing it
        #use a defualtdict with empty sets as the storage for this job
        entry = (__file__, module_name)
        self.loaded.add(str(entry))
Run Code Online (Sandbox Code Playgroud)

Céd*_*ien 3

也许与检查模块一起。

模块a.py

import inspect

print inspect.stack()
Run Code Online (Sandbox Code Playgroud)

模块b.py

import a
Run Code Online (Sandbox Code Playgroud)

运行 b.py 时,我得到:

[
   (<frame object at 0x28a9b70>, '/path/a.py', 5, '<module>', ['print inspect.stack()\n'], 0),
   (<frame object at 0x28a9660>, 'b.py', 2, '<module>', ['import to_import\n'], 0)
]
Run Code Online (Sandbox Code Playgroud)

看起来第二帧包含您需要的内容。