Using the AST module, this is pretty simple:
import ast from collections import namedtuple Import = namedtuple("Import", ["module", "name", "alias"]) def get_imports(path): with open(path) as fh: root = ast.parse(fh.read(), path) for node in ast.iter_child_nodes(root): if isinstance(node, ast.Import): module = [] elif isinstance(node, ast.ImportFrom): module = node.module.split('.') else: continue for n in node.names: yield Import(module, n.name.split('.'), n.asname)
For a module like this:
from coco import bunny from coco.bungy import carrot from meta import teta from rocket import spaceship as sp import bingo import com.stackoverflow import motorbike as car import module1, module2 s="a random variable" def func(): """And a function"""
Output:
>>> for imp in get_imports("/path/to/file.py"): print imp Import(module=['coco'], name=['bunny'], alias=None) Import(module=['coco', 'bungy'], name=['carrot'], alias=None) Import(module=['meta'], name=['teta'], alias=None) Import(module=['rocket'], name=['spaceship'], alias='sp') Import(module=[], name=['bingo'], alias=None) Import(module=[], name=['com', 'stackoverflow'], alias=None) Import(module=[], name=['motorbike'], alias='car') Import(module=[], name=['module1'], alias=None) Import(module=[], name=['module2'], alias=None)
source share