如何静态查找动态加载的模块
如何找到一个Python脚本中动态导入的模块的位置?
根据我的理解,Python可以在运行时动态加载模块。无论是使用_import_(模块名),还是用exec "from x import y",或者通过imp.find_module("模块名")再用imp.load_module(参数1, 参数2, 参数3, 参数4)来加载。
我想获取一个Python文件的所有依赖项。这包括获取那些动态加载的模块,无论是通过硬编码的字符串对象加载的,还是通过某个函数或方法返回的。
对于普通的import 模块名和from x import y,你可以手动扫描代码,或者使用module_finder工具。
那么,如果我想复制一个Python脚本及其所有依赖项(包括自定义的动态加载模块),我该怎么做呢?
5 个回答
1
这件事不可能做到百分之百准确。我在这里回答过一个类似的问题:用Python进行依赖测试
2
从理论上讲,你永远无法确切知道模块是从哪里被导入的。从实际操作来看,如果你只是想知道模块在哪里,可以查看 module.__file__
这个属性,或者在运行脚本时加上 python -v
这个命令,这样可以在模块加载时找到文件。虽然这样做不能列出所有可能被加载的模块,但大多数情况下可以找到大部分模块,代码也比较正常。
另外,你可以参考这个链接: 如何找到Python模块源代码的位置?
3
你是做不到的;编程的本质就是你无法预测代码会执行什么,除非你真的去执行它。所以你无法知道哪些模块可能会被包含进来。
这个问题还因为用户输入而变得更加复杂,比如:__import__(sys.argv[1])
。
关于第一个问题有很多理论上的讨论,通常被称为停机问题,而第二个问题显然是无法解决的。