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ă.")