Source code for realtwin.func_lib._a_install_simulator.inst_sumo

##############################################################################
# Copyright (c) 2024, Oak Ridge National Laboratory                          #
# All rights reserved.                                                       #
#                                                                            #
# This file is part of RealTwin and is distributed under a GPL               #
# license. For the licensing terms see the LICENSE file in the top-level     #
# directory.                                                                 #
#                                                                            #
# Contributors: ORNL Real-Twin Team                                          #
# Contact: realtwin@ornl.gov                                                 #
##############################################################################
"""Control of module imports for the RealTwin function library."""

import os
import zipfile
import pyufunc as pf

from realtwin.func_lib._a_install_simulator.check_sim_env import is_sumo_installed
from realtwin.util_lib.download_file_from_web import download_single_file_from_web


[docs] def install_sumo(sel_dir: list = None, strict_sumo_version: str = "1.21.0", verbose: bool = True, **kwargs) -> bool: """Install the SUMO simulator. Args: sel_dir (list): A list of directories to search for the SUMO executable. Defaults to None. strict_sumo_version (bool): If True, check and install the exact version of SUMO. Default is 1.21.0 verbose (bool): If True, print the installation process. Default is True. kwargs: Additional keyword arguments. Returns: bool: True if the SUMO is installed successfully, False otherwise """ # check sel_dir is a list if not isinstance(sel_dir, (list, type(None))): raise ValueError("sel_dir should be a list.") # Check if SUMO is already installed version_lst = is_sumo_installed(sel_dir=sel_dir, verbose=verbose) if version_lst: # Check if the exact version of SUMO is installed if strict_sumo_version is None or strict_sumo_version in version_lst: print(f" :SUMO is already installed, available versions: {version_lst}") return True print(f"\n :Installing strict_sumo_version SUMO version {strict_sumo_version} " f"(Available versions: {version_lst})...") # If SUMO not installed, # Or strict_sumo_version is True and the version is not installed # Install the SUMO if pf.is_windows(): return install_sumo_windows(strict_sumo_version, verbose=verbose) if pf.is_linux(): print(" :Error: Linux is not supported yet.") return False if pf.is_mac(): print(" :Error: MacOS is not supported yet.") return False print(" :Error: Unsupported operating system.") return False
[docs] def install_sumo_windows(sumo_version: str = "1.21.0", verbose: bool = True) -> bool: """Install SUMO onto the windows system. Args: sumo_version (str): The version of SUMO to be installed. Default is "1.21.0". verbose (bool): If True, print the installation process. Default is True. Returns: bool: True if the SUMO is installed successfully, False otherwise """ print(f" :Installing SUMO {sumo_version} for Windows...") # Download SUMO from the official website sumo_release_url = "https://sumo.dlr.de/releases/" sumo_version_win = f"sumo-win64-{sumo_version}.zip" download_path = pf.path2linux(os.path.join(os.getcwd(), "sumo.zip")) extract_path = pf.path2linux(os.path.join(os.getcwd(), "SUMO")) # Download the SUMO zip file from the official website sumo_zip_url = f"{sumo_release_url}{sumo_version}/{sumo_version_win}" id_download = download_single_file_from_web(sumo_zip_url, download_path) if not id_download: return False # Extract the SUMO zip file if verbose: print(f" :Extracting SUMO {sumo_version} for Windows at: {extract_path}...") with zipfile.ZipFile(download_path, 'r') as zip_ref: zip_ref.extractall(extract_path) # Clean up the downloaded zip file os.remove(download_path) # check if SUMO bin folder exists sumo_bin_path = os.path.join(extract_path, f"sumo-{sumo_version}", "bin") sumo_bin_path = pf.path2linux(sumo_bin_path) if not os.path.exists(sumo_bin_path): print(f" :Error: bin folder not found in extracted SUMO directory: {sumo_bin_path}") return False # Add the SUMO bin folder to the system PATH if sumo_bin_path not in os.environ['PATH']: os.environ["PATH"] += os.pathsep + sumo_bin_path[0].upper() + sumo_bin_path[1:] os.environ["PATH"] += os.pathsep + sumo_bin_path[0].lower() + sumo_bin_path[1:] # add_path = subprocess.run(["setx", "PATH", f"%PATH%;{sumo_bin_path}"], shell=True, check=True) # if add_path.returncode == 0: # print(" :SUMO is installed successfully.") # else: # print(" :Error: Failed to add SUMO bin folder to system PATH.") return True
[docs] def install_sumo_linux(sumo_version: str = "1.21.0", verbose: bool = True) -> bool: """Install SUMO onto the linux system. Args: sumo_version (str): The version of SUMO to be installed. Default is "1.21.0". verbose (bool): If True, print the installation process. Default is True. Note: The installation of SUMO on Linux is not supported yet. upcoming feature. Returns: bool: True if the SUMO is installed successfully on Linux, False otherwise """ print(f" :Installing SUMO {sumo_version} for Linux system...") print("verbose", verbose) print(" :Warning: Install SUMO on Linux is not supported yet.") return False
[docs] def install_sumo_macos(sumo_version: str = "1.21.0", verbose: bool = True) -> bool: """Install SUMO onto the mac system. Args: sumo_version (str): The version of SUMO to be installed. Default is "1.21.0". verbose (bool): If True, print the installation process. Default is True. Note: The installation of SUMO on Mac is not supported yet. upcoming feature. Returns: bool: True if the SUMO is installed successfully on Mac, False otherwise """ print(f" :Installing SUMO {sumo_version} for Mac system...") print("verbose", verbose) print(" :Warning: Install SUMO on Mac is not supported yet.") return False