【问题标题】:how do you statically find dynamically loaded modules你如何静态找到动态加载的模块
【发布时间】:2011-11-18 11:53:30
【问题描述】:

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

所以,据我了解,python 可以动态(在运行时)加载模块。 无论是使用 _import_(module_name),还是使用 exec "from x import y",或者使用 imp.find_module ("module_name") 然后是 imp.load_module(param1, param2, param3, param4)

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

对于普通 import module_namefrom x import y,您可以手动扫描代码或使用 module_finder。

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

【问题讨论】:

    标签: python module loadmodule


    【解决方案1】:

    只是一个想法,我不确定它是否可行:

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

    1. 无论何时调用,获取当前堆栈跟踪并计算调用函数。也许globals参数中的信息到__import__就足够了。
    2. 获取调用函数的模块并存储该模块的名称以及要导入的内容
    3. 重定向调用真正的__import__

    完成此操作后,您可以使用python -m magic_module yourapp.py 调用您的应用程序。魔术模块必须将信息存储在您以后可以检索到的地方。

    【讨论】:

    • 这样的东西应该可以工作。它通过实际运行它来解决“如果不执行与运行它等效的操作,您将无法知道代码将做什么”。但它仍然只为您提供在一个特定模块上导入的模块,而不是它可能需要导入的所有模块。对于一个具有合理静态导入的 Python 模块来说,这可能就足够了,但如果它具有合理的静态导入,那么 grepping 的“import”可能就足够了。
    【解决方案2】:

    这真是个问题。

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

    相当于Halting Problem,不幸的是没有通用的解决方案。

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

    【讨论】:

      【解决方案3】:

      从理论的角度来看,您永远无法确切知道正在导入什么/从哪里导入模块。从实际的角度来看,如果您只是想知道模块在哪里,请检查module.__file__ 属性或运行python -v 下的脚本以查找加载模块时的文件。这不会给你所有可能被加载的模块,但会得到大多数模块的代码大部分是正常的。

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

      【讨论】:

        【解决方案4】:

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

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

        关于第一个问题有很多理论资料,通常描述为Halting problem,第二个显然做不到。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2019-05-18
            • 1970-01-01
            • 1970-01-01
            • 2015-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-20
            相关资源
            最近更新 更多