我正在接近我的最终目标,即在模块和其他导入模块之间生成一个漂亮的图表。
例如,如果 x 从 y 和 z 导入,而 y 从 t 和 v 导入,我想:
x -> y, z
y -> t, v
现在我已经有了如下定义的导入 Hook ,但是在一个简单的文件上运行它我没有得到我期望的结果:
python study_imports.py CollectImports simple.py
('study_imports.py', 'study_imports')
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))
最佳答案
也许与 inspect模块。
模块a.py
import inspect
print inspect.stack()
模块 b.py
import a
当运行 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)
]
看起来第二帧包含您需要的内容。
关于python - 生成进口图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8246413/