# Script to find all third party imports from python projects # How to Run # sudo pip install find-import virtualenv pymod2pkg # python findimports.py # Author: Chandan Kumar import pymod2pkg import os import shutil import subprocess import shlex import sys import virtualenv import tempfile def list_all_pyfiles(path): """ list down all .py files with complete path """ files_path = [] for root, subdir, files in os.walk(path): for file in files: if file.endswith('.py'): files_path.append(os.path.join(root, file)) return files_path def get_imports(filepath): """ Returns a list of all imports """ output = subprocess.check_output(['find-import', filepath]) if output.split(): return output.split() def get_all_imports(file_list): """ Return a dict of all imports with all imports {'file_path':[a, b, c, d]} """ imports, import_list = {}, [] for file in file_list: if get_imports(file) != None: imports.update({file: get_imports(file)}) for data in imports.values(): import_list.extend(data) return list(set(import_list)) def check_import(modules): """ Find thirdparty modules """ third_party_imports = [] path = tempfile.mkdtemp() virtualenv.create_environment(path, clear=True) venv_path = os.path.join(path, 'bin', 'python') for module in modules: # FIX ME corner case for import import and import the statement if not module in ['import', 'the']: cmd = shlex.split("%s -c 'try:\n import %s\n print('True')\nexcept ImportError: print('False')'" % (venv_path, module)) out = subprocess.check_output(cmd) if 'False'in out.split(): third_party_imports.append(module) # Remove virtualenv shutil.rmtree(path) return third_party_imports def list_third_party_pkgs(third_party_imports): """ List all third party packages from imports """ pkgs = [pymod2pkg.module2package(module, pymod2pkg.platform.linux_distribution()[0]) for module in third_party_imports] return pkgs if __name__ == "__main__": if len(sys.argv) > 1: if os.path.exists(sys.argv[1]): files = list_all_pyfiles(sys.argv[1]) imports = get_all_imports(files) third_party_imports = check_import(imports) pkgs = list_third_party_pkgs(third_party_imports) print('\n'.join(pkgs)) else: print("Path Not found.")