__init__.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import sys
  2. import importlib
  3. from pathlib import Path
  4. PKGS_DIR = Path(__file__).parent
  5. VENDORED_PKGS = [
  6. 'abx',
  7. # 'pydantic-pkgr',
  8. # ... everything else in archivebox/pkgs/* comes after ...
  9. ]
  10. # VENDORED_PKGS += [ ... ./pkgs/* ... ]
  11. for subdir in reversed(sorted(PKGS_DIR.iterdir())):
  12. if subdir.is_dir() and subdir.name not in VENDORED_PKGS and not subdir.name.startswith('_'):
  13. VENDORED_PKGS.append(subdir.name)
  14. def load_vendored_pkgs():
  15. """Add archivebox/pkgs to sys.path and import all vendored python packages present within"""
  16. if str(PKGS_DIR) not in sys.path:
  17. sys.path.append(str(PKGS_DIR))
  18. for pkg_name in VENDORED_PKGS:
  19. pkg_dir = PKGS_DIR / pkg_name
  20. assert pkg_dir.is_dir(), f'Required vendored pkg {pkg_name} could not be found in {pkg_dir}'
  21. try:
  22. lib = importlib.import_module(pkg_name)
  23. # print(f"Successfully imported lib from environment {pkg_name}")
  24. except ImportError:
  25. sys.path.append(str(pkg_dir)) # perhaps the pkg is in a subdirectory of the directory
  26. try:
  27. lib = importlib.import_module(pkg_name)
  28. # print(f"Successfully imported lib from vendored fallback {pkg_name}: {inspect.getfile(lib)}")
  29. except ImportError as e:
  30. print(f"Failed to import required pkg from sys.path or archivebox/pkgs dir {pkg_name}: {e}", file=sys.stderr)
  31. sys.exit(1)