从python中的import语句中查找

时间:2018-05-29 12:33:10

标签: python python-3.x python-import inspect

假设我有一个包含一些代码的模块,我想找到这个模块的导入库。

import os
import pandas as pd
import numpy as np
from os.path import basename, join

def export(df, folder):
    """some export thing (not really important)"""
    f = join(folder, "test.csv")
    df.to_csv(f)
    return f

所以这只是一个虚拟的例子。在这个问题的上下文中,这些方法的作用并不重要

从上一个问题开始,我能够获取导入模块的导入语句,但没有意识到from foo import bar不会显示。

[(x, y.__name__) for x,y in inspect.getmembers(sys.modules[__name__], inspect.ismodule)]

这将返回一个元组:

[('inspect', 'inspect'), ('np', 'numpy'), ('os', 'os'), ('pd', 'pandas'), ('sys', 'sys')]

然后我可以获取该列表,如果元组位置0!=位置1,则它是import foo as f情况。缺少的是from os.path impor basename, joinfrom os import path的情况。如何包含此类导入?

由于

1 个答案:

答案 0 :(得分:1)

您需要创建一个接受模块和功能的自定义谓词函数。在这种情况下,您也可以获得所有功能的名称,然后根据您的需要过滤成员,您就可以获得所需的结果。

def get_members(module):
    predicate = lambda x: inspect.ismodule or  inspect.function

    for x,y in inspect.getmembers(module, predicate):
        try:
            md = y.__module__
            if md != "__main__":
                yield (x, y.__name__, y.__module__)
        except:
            if inspect.ismodule(y):
                yield (x, y.__name__) 

演示:

# test.py

import os
import pandas as pd
import numpy as np
from os.path import basename, join
from itertools import product
import inspect
import sys

def export(df, folder):
    """some export thing (not really important)"""
    f = join(folder, "test.csv")
    df.to_csv(f)
    return f

def get_members(module):
    predicate = lambda x: inspect.ismodule or  inspect.function

    for x,y in inspect.getmembers(module, predicate):
        try:
            md = y.__module__
            if md != "__main__":
                yield (x, y.__name__, y.__module__)
        except:
            if inspect.ismodule(y):
                yield (x, y.__name__)    


print(list(get_members(sys.modules[__name__])))

输出:

~/Desktop$ python3 test.py 
[('__builtins__', 'builtins'), ('basename', 'basename', 'posixpath'), ('inspect', 'inspect'), ('join', 'join', 'posixpath'), ('np', 'numpy'), ('os', 'os'), ('pd', 'pandas'), ('product', 'product', 'itertools'), ('sys', 'sys')]
相关问题