生成导入图形

2024-05-08 16:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

x -> y, z
y -> t, v

现在,我已经将导入钩子定义如下,但是在一个简单的文件上运行它并没有得到预期的效果:

^{pr2}$

在哪里简单.py实际上是从书房进口的。 问题是我想看看”简单.py“而不是”学习_导入.py“,是否有方法获取实际导入另一个模块的文件的路径?在

^{3}$

Tags: 模块文件方法py路径图形定义钩子
3条回答

所以我在snakefood中做得更好,最后用AST重写了代码。 Snakefood仍然使用编译器,这是弃用的,比使用ast慢得多。在

结果很好,例如这是一个访客:

from ast import parse, NodeVisitor


class ImportVisitor(NodeVisitor):

    def __init__(self):
        self.imported = set()
        super(ImportVisitor, self).__init__()

    def __str__(self):
        return '\n'.join(x for x in self.imported)

    def visit_Import(self, node):
        for n in node.names:
            self.imported.add(n.name)

    #that we are using
    def visit_ImportFrom(self, node):
        self.imported.add(node.module)

可用于例如:

^{pr2}$

检查技巧似乎很有效:) 我有点像简单.py:在中设置(['study_imports'])导入.log. 在

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 = defaultdict(lambda: 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(('%s: %s' % (k, v)) for k, v in self.loaded.items())
        open(self.output_file, 'w').write(dumped_str)

    def find_module(self, module_name, package=None):
        st = inspect.stack()
        self.loaded[st[1][1]].add(module_name)

也许用inspect模块。在

模块a.py

import inspect

print inspect.stack()

模块b.py

^{pr2}$

运行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)
]

看起来第二帧包含了你需要的。在

相关问题 更多 >