你如何静态地找到动态加载的模块

时间:2011-09-16 07:57:56

标签: python module loadmodule

如何从python脚本获取(找到位置)动态导入的模块?

所以,我理解的python可以动态地(在运行时)加载模块。 使用 _ 导入 _(module_name),或使用 exec“来自x import y”,使用 imp.find_module (“module_name”)然后 imp.load_module(param1,param2,param3,param4)

知道我想获得python文件的所有依赖项。这将包括获取(或至少我尝试过)动态加载的模块,这些模块通过使用硬编码的字符串对象或由函数/方法返回的模块加载。

对于普通导入模块名称来自x import y ,您可以手动扫描代码或使用module_finder。

因此,如果我想复制一个python脚本及其所有依赖项(包括自定义动态加载的模块),我应该怎么做?

5 个答案:

答案 0 :(得分:3)

你不能;编程(在任何语言中)的本质意味着您无法预测在没有实际执行代码的情况下将执行哪些代码。因此,您无法确定哪些模块可以包含在内。

用户输入进一步混淆了这一点,请考虑:__import__(sys.argv[1])

关于第一个问题有很多理论信息,通常被描述为Halting problem,第二个问题显然无法完成。

答案 1 :(得分:2)

从理论角度来看,您永远无法确切知道导入的模块是什么/何处。从实际角度来看,如果您只是想知道模块的位置,请检查module.__file__属性或运行python -v下的脚本以查找加载模块时的文件。这不会为您提供可能加载的每个模块,但会使大多数模块具有大部分理智的代码。

另请参阅:How do I find the location of Python module sources?

答案 2 :(得分:1)

这不可能100%准确地完成。我在这里回答了类似的问题:Dependency Testing with Python

答案 3 :(得分:1)

只是一个想法,我不确定它会起作用:

您可以编写一个包含__builtin__.__import__包装器的模块。此包装器将保存对旧__import__的引用,然后将函数分配给执行以下操作的__builtin__.__import__

  1. 每当调用时,获取当前的堆栈跟踪并计算出调用函数。也许globals __import__参数中的信息就足够了。
  2. 获取调用函数的模块并存储此模块的名称以及将导入的内容
  3. 将呼叫重定向到真实__import__
  4. 完成此操作后,您可以使用python -m magic_module yourapp.py致电您的申请。魔术模块必须将信息存储在稍后可以检索的位置。

答案 4 :(得分:0)

这是一个非常重要的问题。

静态分析是关于预测所有可能的运行时执行路径,并确保程序根据特定输入停止。

这相当于Halting Problem,遗憾的是没有通用解决方案。

解决动态依赖关系的唯一方法是运行代码。