import os
import subprocess
def write_log(output, name, type):
script_dir = os.path.dirname((__file__))
with open(
os.path.join(script_dir, "..", "..", "logs", f"{type}-{name}.log"), "w"
) as outfile:
outfile.write("\n".join(output))
def pip_install_wrapper(requirements, name):
def fn():
output = []
for line in _pip_install(requirements, name):
output.append(line)
yield "
".join(output)
write_log(output, name, type="pip-install")
return fn
def pip_uninstall_wrapper(package_name, name):
def fn():
output = []
for line in _pip_uninstall(package_name, name):
output.append(line)
yield "
".join(output)
write_log(output, name, type="pip-uninstall")
return fn
def _pip_install(requirements, name):
# process = subprocess.Popen(
# f"uv pip install {requirements}",
# shell=True,
# stdout=subprocess.PIPE,
# stderr=subprocess.STDOUT,
# universal_newlines=True,
# )
# # Stream the output to the console
# for line in process.stdout: # type: ignore
# print(line, end="")
# yield line
# # Wait for the process to finish
# process.wait()
# # Check if the process was successful
# if process.returncode == 0:
# print(f"Successfully installed {name}")
# yield f"Successfully installed {name}, please restart the webui"
# else:
# print(f"Failed to install {name}")
# yield f"Failed to install {name}"
try:
print(f"Installing {name} dependencies...")
yield from pip_shell(f"pip install {requirements}")
# yield from pip_shell(f"uv pip install {requirements}")
print(f"Successfully installed {name} dependencies")
yield f"Successfully installed {name} dependencies"
except Exception:
print(f"Failed to install {name} dependencies")
yield f"Failed to install {name} dependencies"
def _pip_uninstall(package_name, name):
try:
print(f"Uninstalling {name} ({package_name})...")
yield from pip_shell(f"pip uninstall -y {package_name}")
# yield from pip_shell(f"uv pip uninstall {package_name}")
print(f"Successfully uninstalled {name} ({package_name})")
yield f"Successfully uninstalled {name} ({package_name})"
except Exception:
print(f"Failed to uninstall {name} ({package_name})")
yield f"Failed to uninstall {name} ({package_name})"
def pip_shell(command):
process = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
)
# Stream the output to the console
for line in process.stdout: # type: ignore
print(line, end="")
yield line
# Wait for the process to finish
process.wait()
if process.returncode != 0:
raise Exception(f"Failed to run {command}")