diff --git a/installPsychoPy.py b/installPsychoPy.py new file mode 100644 index 0000000000..004cdcf8cc --- /dev/null +++ b/installPsychoPy.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd. +# Distributed under the terms of the GNU General Public License (GPL). + +import subprocess +import os +import sys +import requests + +"""This script will install PsychoPy to the current Python environment. + +For Linux installations, the script will fetch the supported linux distros for wxPython +and interactively select the distro and version to download the appropriate .whl file. + +After that the script will install PsychoPy using pip. + +NB: At present, for windows and MacOS you may as well just use `pip install psychopy` but +in the future we may add some additional functionality here, like adding application +shortcuts, checking/recommending virtual envs etc. +""" + +# Author: Florian Osmani +# Author: Jonathan Peirce + +wxLinuxUrl = "https://extras.wxpython.org/wxPython4/extras/linux/gtk3/" + +def installWhlFile(whlUrl): + """Installs a single specified wheel file using pip""" + wheel_path = os.path.basename(whlUrl) + subprocess.run([sys.exectuable, '-m', 'pip', 'install', '-U', '-f', wheel_path, 'wxPython'], check=True) + +def installPsychoPy(): + """Runs pip install psychopy""" + subprocess.run([sys.exectuable, '-m', 'pip', 'install', 'psychopy'], check=True) + +def getWxUrl(distroNames=None): + """Fetch the supported linux distros for wx and interactively select the + distro and version to download the appropriate .whl file. + + Args: + distroNames (_type_, optional): _description_. Defaults to None. + + Returns: + list: URL of the wheel for the selected distro/version + """ + def extractDistroNames(url): + """Extract the names of the linux distributions from the html content""" + + response = requests.get(url) + response.raise_for_status() + + distro_names = [] + lines = response.text.split('\n') + for line in lines: + if ' 10: + print("Sorry, please use Python 3.8, 3.9, or 3.10 to install Psychopy") + return None + + python_cp = f"cp{version_info.major}{version_info.minor}" + + def selectDistro(distroNames): + print("Please select your Linux distribution:") + for i, distro in enumerate(distroNames): + print(f"{i + 1}. {distro}") + + while True: + choice = input("Enter your choice (number): ") + if choice.isdigit() and 1 <= int(choice) <= len(distroNames): + return distroNames[int(choice) - 1] + else: + print("Invalid choice, please try again.") + + def organizeDistributions(distroNames): + distroDict = {} + for distro in distroNames: + nameParts = distro.split('-') + distroName = '-'.join(nameParts[:-1]) + version = nameParts[-1] if len(nameParts) > 1 else 'default' + + if distroName in distroDict: + distroDict[distroName].append(version) + else: + distroDict[distroName] = [version] + + return distroDict + + def selectVersion(selectedDistro, versions): + while True: + print("Please select the version:") + for i, version in enumerate(versions): + print(f"{i + 1}. {selectedDistro}-{version}") + print("0. Go back") + + choice = input("Enter your choice (number): ") + if choice.isdigit(): + choice = int(choice) + if 1 <= choice <= len(versions): + return versions[choice - 1] + elif choice == 0: + return None + print("Invalid choice, please try again.") + + def fetchWhlFiles(htmlContent, pythonVersions): + all = [] + recommended = [] + lines = htmlContent.split('\n') + for line in lines: + if '