仅给出源文件,它导入哪些文件?

时间:2016-10-13 15:32:05

标签: python python-3.x python-import abstract-syntax-tree

我使用ast模块在​​python3中构建依赖关系图。如果要执行该导入语句,我如何知道将导入哪些文件?

2 个答案:

答案 0 :(得分:1)

不是一个完整的答案,但这里有一些你应该注意的事项:

  • 导入可能发生在条件或try-catch块中。因此,根据环境变量的设置,模块A可能会也可能不会导入模块B.
  • 有各种各样的导入语法:import Afrom A import Bfrom A import *from . import Afrom .. import Afrom ..A import B以及他们的将A替换为子模块的版本。
  • 导入可以在任何可执行文件中发生 - 文件的顶层,函数,类定义等。
  • eval可以使用导入来评估代码。如果您认为此类代码是依赖项,请由您自己决定。

标准库modulefinder模块可能有帮助。

答案 1 :(得分:0)

正如评论中所建议的那样:其他答案是有效的,但其中一个基本问题是您的示例仅适用于“简单”脚本或文件:许多更复杂的代码将使用动态导入等内容:考虑以下内容:

path, task_name = "module.function".rsplit(".", 1);
module = importlib.import_module(path);
real_func = getattr(module, task_name); 
real_func();

可以对实际的原始字符串进行模糊处理,或从数据库,文件或...中提取

还有importlib的替代方案,但这是你可能在@ horia的好答案中看到的exec类型的东西。