63 lines
2.2 KiB
Python
63 lines
2.2 KiB
Python
import sys
|
|
import subprocess
|
|
import importlib.metadata
|
|
import os
|
|
|
|
def check_dependencies():
|
|
"""Checks if dependencies in requirements.txt are installed."""
|
|
requirements_file = "requirements.txt"
|
|
if not os.path.exists(requirements_file):
|
|
print(f"Warning: {requirements_file} not found. Skipping dependency check.")
|
|
return
|
|
|
|
print("Checking dependencies...")
|
|
missing_packages = []
|
|
|
|
with open(requirements_file, "r") as f:
|
|
for line in f:
|
|
line = line.strip()
|
|
if not line or line.startswith("#"):
|
|
continue
|
|
|
|
# Simple parsing for package name.
|
|
# This handles 'package>=version', 'package==version', 'package'
|
|
# It does NOT handle complex markers perfectly, but suffices for basic checking.
|
|
package_name = line.split("=")[0].split(">")[0].split("<")[0].strip()
|
|
|
|
try:
|
|
importlib.metadata.version(package_name)
|
|
except importlib.metadata.PackageNotFoundError:
|
|
missing_packages.append(line)
|
|
|
|
if missing_packages:
|
|
print(f"Missing dependencies: {', '.join(missing_packages)}")
|
|
print("Installing missing dependencies...")
|
|
try:
|
|
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", requirements_file])
|
|
print("Dependencies installed successfully.")
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error installing dependencies: {e}")
|
|
sys.exit(1)
|
|
else:
|
|
print("All dependencies checked.")
|
|
|
|
def main():
|
|
check_dependencies()
|
|
|
|
print("Starting application...")
|
|
try:
|
|
# Run the main application
|
|
# Using sys.executable ensures we use the same python interpreter
|
|
subprocess.run([sys.executable, "main.py"], check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Application exited with error: {e}")
|
|
sys.exit(e.returncode)
|
|
except KeyboardInterrupt:
|
|
print("\nApplication stopped by user.")
|
|
except Exception as e:
|
|
print(f"An unexpected error occurred: {e}")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|