import os import sys import subprocess import pkg_resources local_dir = os.path.dirname(__file__) requirements_files = {os.path.join(local_dir, 'requirements.txt')} if sys.version_info < (3, 8, 6): raise RuntimeError("Incompatible Python Version. 3.8.7+ is supported.") update_ran = getattr(sys, "frozen", False) # don't run update if environment is frozen/compiled if not update_ran: for entry in os.scandir(os.path.join(local_dir, "worlds")): if entry.is_dir(): req_file = os.path.join(entry.path, "requirements.txt") if os.path.exists(req_file): requirements_files.add(req_file) def update_command(): for file in requirements_files: subprocess.call([sys.executable, '-m', 'pip', 'install', '-r', file, '--upgrade']) def update(yes=False, force=False): global update_ran if not update_ran: update_ran = True if force: update_command() return for req_file in requirements_files: path = os.path.join(os.path.dirname(sys.argv[0]), req_file) if not os.path.exists(path): path = os.path.join(os.path.dirname(__file__), req_file) with open(path) as requirementsfile: for line in requirementsfile: if line.startswith('https://'): # extract name and version from url wheel = line.split('/')[-1] name, version, _ = wheel.split('-', 2) line = f'{name}=={version}' requirements = pkg_resources.parse_requirements(line) for requirement in requirements: requirement = str(requirement) try: pkg_resources.require(requirement) except pkg_resources.ResolutionError: if not yes: import traceback traceback.print_exc() input(f'Requirement {requirement} is not satisfied, press enter to install it') update_command() return if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description='Install archipelago requirements') parser.add_argument('-y', '--yes', dest='yes', action='store_true', help='answer "yes" to all questions') parser.add_argument('-f', '--force', dest='force', action='store_true', help='force update') args = parser.parse_args() update(args.yes, args.force)