utils.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import logging
  2. import os
  3. import subprocess
  4. import sys
  5. logger = logging.getLogger()
  6. def install_user_tool_dependencies(user_tools_path: str):
  7. """
  8. Installs dependencies listed in user_requirements.txt within the user tools directory.
  9. """
  10. requirements_path = os.path.join(user_tools_path, "user_requirements.txt")
  11. if os.path.exists(requirements_path):
  12. logger.info(
  13. f"Found user requirements file at: {requirements_path}. Attempting to install user tool dependencies..."
  14. )
  15. try:
  16. # Use subprocess to run pip install
  17. result = subprocess.run(
  18. [
  19. sys.executable,
  20. "-m",
  21. "pip",
  22. "install",
  23. "-r",
  24. requirements_path,
  25. ],
  26. check=True,
  27. capture_output=True,
  28. text=True,
  29. )
  30. logger.info("Successfully installed user tool dependencies.")
  31. logger.debug(f"pip install output:\n{result.stdout}")
  32. # Add the user tools path to sys.path AFTER successful installation
  33. parent_dir = os.path.dirname(user_tools_path)
  34. if parent_dir not in sys.path:
  35. sys.path.append(parent_dir)
  36. logger.info(
  37. f"Added '{parent_dir}' to sys.path for user tool imports."
  38. )
  39. # Also add the directory itself if tools are directly inside
  40. if user_tools_path not in sys.path:
  41. sys.path.append(user_tools_path)
  42. logger.info(
  43. f"Added '{user_tools_path}' to sys.path for user tool imports."
  44. )
  45. except subprocess.CalledProcessError as e:
  46. logger.error(
  47. f"Failed to install user tool dependencies from {requirements_path}.\nReturn code: {e.returncode}\nstdout:\n{e.stdout}stderr:\n{e.stderr}"
  48. )
  49. raise RuntimeError(
  50. f"Failed to install user dependencies from {requirements_path}"
  51. ) from e
  52. except FileNotFoundError:
  53. logger.error(
  54. f"Error: '{sys.executable} -m pip' command not found. Make sure pip is installed in the Python environment."
  55. )
  56. raise
  57. except Exception as e:
  58. logger.error(
  59. f"An unexpected error occurred during pip install: {e}"
  60. )
  61. raise
  62. else:
  63. logger.warning(
  64. f"User requirements file not found at: {requirements_path}. Skipping user dependency installation."
  65. )
  66. # If the requirements file is not found, add the user tools path to sys.path
  67. parent_dir = os.path.dirname(user_tools_path)
  68. if parent_dir not in sys.path:
  69. sys.path.append(parent_dir)
  70. logger.info(
  71. f"Added '{parent_dir}' to sys.path for user tool imports (no requirements found)."
  72. )
  73. if user_tools_path not in sys.path:
  74. sys.path.append(user_tools_path)
  75. logger.info(
  76. f"Added '{user_tools_path}' to sys.path for user tool imports (no requirements found)."
  77. )