analitics

Pages

Showing posts with label importlib. Show all posts
Showing posts with label importlib. Show all posts

Monday, September 8, 2025

Python 3.13.0 : Script for python modules then installs them.

This script scans a folder full of .py files Python scripts, identifies all the external modules they import, filters out built-in ones, writes the installable ones to a requirements.txt file, and then installs them using pip—in parallel threads for speed.
I use the copilot and some comments are into my language, but I tested and works well:
import os
import re
import sys
import importlib.util
import subprocess
import threading

def find_python_files(root_dir):
    py_files = []
    for dirpath, _, filenames in os.walk(root_dir):
        for file in filenames:
            if file.endswith(".py"):
                py_files.append(os.path.join(dirpath, file))
    return py_files

def extract_imports(file_path):
    imports = set()
    pattern = re.compile(r'^\s*(?:import|from)\s+([a-zA-Z0-9_\.]+)')
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line in f:
                match = pattern.match(line)
                if match:
                    module = match.group(1).split('.')[0]
                    imports.add(module)
    except Exception as e:
        print(f"⚠️ Eroare la citirea fișierului {file_path}: {e}")
    return imports

def is_third_party(module_name):
    if not module_name or module_name in sys.stdlib_module_names:
        return False
    spec = importlib.util.find_spec(module_name)
    return spec is not None

def write_requirements(modules, output_file="requirements.txt"):
    with open(output_file, "w") as f:
        for module in sorted(modules):
            f.write(f"{module}\n")
    print(f"\n📄 Fișier '{output_file}' generat cu {len(modules)} module.")

def install_module(module_name):
    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", module_name])
        print(f"✅ Instalare reușită: {module_name}")
    except subprocess.CalledProcessError:
        print(f"❌ Eroare la instalarea: {module_name}")
    except Exception as e:
        print(f"⚠️ Excepție neașteptată pentru {module_name}: {e}")

def install_modules_parallel(modules):
    threads = []
    for module in modules:
        t = threading.Thread(target=install_module, args=(module,))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

def main(root_dir):
    all_imports = set()
    py_files = find_python_files(root_dir)
    print(f"🔍 Găsit {len(py_files)} fișiere .py în folderul '{root_dir}'")

    for file in py_files:
        imports = extract_imports(file)
        all_imports.update(imports)

    print(f"\n📦 Module detectate: {sorted(all_imports)}")

    third_party = [m for m in all_imports if is_third_party(m)]
    print(f"\n✅ Module terțe (instalabile cu pip): {sorted(third_party)}")

    write_requirements(third_party)
    print("\n🚀 Încep instalarea modulelor...\n")
    install_modules_parallel(third_party)

if __name__ == "__main__":
    folder_path = input("📁 Introdu calea către folderul cu fișiere .py: ").strip()
    if os.path.isdir(folder_path):
        main(folder_path)
    else:
        print("❌ Calea introdusă nu este validă.")