|
from __future__ import annotations |
|
|
|
import importlib.util |
|
import subprocess |
|
import sys |
|
from importlib.metadata import version |
|
|
|
from packaging.version import parse |
|
|
|
|
|
def is_installed( |
|
package: str, min_version: str | None = None, max_version: str | None = None |
|
): |
|
try: |
|
spec = importlib.util.find_spec(package) |
|
except ModuleNotFoundError: |
|
return False |
|
|
|
if spec is None: |
|
return False |
|
|
|
if not min_version and not max_version: |
|
return True |
|
|
|
if not min_version: |
|
min_version = "0.0.0" |
|
if not max_version: |
|
max_version = "99999999.99999999.99999999" |
|
|
|
if package == "google.protobuf": |
|
package = "protobuf" |
|
|
|
try: |
|
pkg_version = version(package) |
|
return parse(min_version) <= parse(pkg_version) <= parse(max_version) |
|
except Exception: |
|
return False |
|
|
|
|
|
def run_pip(*args): |
|
subprocess.run([sys.executable, "-m", "pip", "install", *args]) |
|
|
|
|
|
def install(): |
|
deps = [ |
|
|
|
("ultralytics", "8.0.97", None), |
|
("mediapipe", "0.10.0", None), |
|
("huggingface_hub", None, None), |
|
("pydantic", None, None), |
|
|
|
("protobuf", "3.20.0", "3.20.9999"), |
|
] |
|
|
|
for pkg, low, high in deps: |
|
|
|
name = "google.protobuf" if pkg == "protobuf" else pkg |
|
|
|
if not is_installed(name, low, high): |
|
if low and high: |
|
cmd = f"{pkg}>={low},<={high}" |
|
elif low: |
|
cmd = f"{pkg}>={low}" |
|
elif high: |
|
cmd = f"{pkg}<={high}" |
|
else: |
|
cmd = pkg |
|
|
|
run_pip("-U", cmd) |
|
|
|
|
|
try: |
|
import launch |
|
|
|
skip_install = launch.args.skip_install |
|
except Exception: |
|
skip_install = False |
|
|
|
if not skip_install: |
|
install() |
|
|