Files
scrypted/server/python/plugin_pip.py
2024-03-05 18:04:04 -08:00

102 lines
3.0 KiB
Python

import os
import subprocess
import sys
from typing import Any
import shutil
def get_requirements_files(requirements: str):
want_requirements = requirements + '.txt'
installed_requirementstxt = requirements + '.installed.txt'
return want_requirements, installed_requirementstxt
def need_requirements(requirements_basename: str, requirements_str: str):
_, installed_requirementstxt = get_requirements_files(requirements_basename)
if not os.path.exists(installed_requirementstxt):
return True
try:
f = open(installed_requirementstxt, "rb")
installed_requirements = f.read().decode('utf8')
return requirements_str != installed_requirements
except:
return True
def remove_pip_dirs(plugin_volume: str):
try:
for de in os.listdir(plugin_volume):
if (
de.startswith("linux")
or de.startswith("darwin")
or de.startswith("win32")
or de.startswith("python")
or de.startswith("node")
):
filePath = os.path.join(plugin_volume, de)
print("Removing old dependencies: %s" % filePath)
try:
shutil.rmtree(filePath)
except:
pass
except:
pass
def install_with_pip(
python_prefix: str,
packageJson: Any,
requirements_str: str,
requirements_basename: str,
ignore_error: bool = False,
):
requirementstxt, installed_requirementstxt = get_requirements_files(requirements_basename)
os.makedirs(python_prefix, exist_ok=True)
print(f"{os.path.basename(requirementstxt)} (outdated)")
print(requirements_str)
f = open(requirementstxt, "wb")
f.write(requirements_str.encode())
f.close()
try:
pythonVersion = packageJson["scrypted"]["pythonVersion"]
except:
pythonVersion = None
pipArgs = [
sys.executable,
"-m",
"pip",
"install",
"-r",
requirementstxt,
"--prefix",
python_prefix,
]
if pythonVersion:
print("Specific Python version requested. Forcing reinstall.")
# prevent uninstalling system packages.
pipArgs.append("--ignore-installed")
# force reinstall even if it exists in system packages.
pipArgs.append("--force-reinstall")
p = subprocess.Popen(pipArgs, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
line = p.stdout.readline()
if not line:
break
line = line.decode("utf8").rstrip("\r\n")
print(line)
result = p.wait()
print("pip install result %s" % result)
if result:
if not ignore_error:
raise Exception("non-zero result from pip %s" % result)
else:
print("ignoring non-zero result from pip %s" % result)
else:
f = open(installed_requirementstxt, "wb")
f.write(requirements_str.encode())
f.close()