| # This file must use Python 1.5 syntax. |
| import glob |
| import os |
| import re |
| import string |
| import sys |
| |
| |
| class check_python_version: |
| |
| def __init__(self): |
| version = None |
| try: |
| version = sys.version_info[0:2] |
| except AttributeError: |
| pass # pre 2.0, no neat way to get the exact number |
| |
| # The change to prefer 2.4 really messes up any systems which have both |
| # the new and old version of Python, but where the newer is default. |
| # This is because packages, libraries, etc are all installed into the |
| # new one by default. Some things (like running under mod_python) just |
| # plain don't handle python restarting properly. I know that I do some |
| # development under ipython and whenever I run (or do anything that |
| # runs) 'import common' it restarts my shell. Overall, the change was |
| # fairly annoying for me (and I can't get around having 2.4 and 2.5 |
| # installed with 2.5 being default). |
| if not version or version < (2, 4) or version >= (3, 0): |
| try: |
| # We can't restart when running under mod_python. |
| from mod_python import apache |
| except ImportError: |
| self.restart() |
| |
| |
| def extract_version(self, path): |
| match = re.search(r'/python(\d+)\.(\d+)$', path) |
| if match: |
| return (int(match.group(1)), int(match.group(2))) |
| else: |
| return None |
| |
| |
| PYTHON_BIN_GLOB_STRINGS = ['/usr/bin/python2*', '/usr/local/bin/python2*'] |
| |
| |
| def find_desired_python(self): |
| """Returns the path of the desired python interpreter.""" |
| pythons = [] |
| for glob_str in self.PYTHON_BIN_GLOB_STRINGS: |
| pythons.extend(glob.glob(glob_str)) |
| |
| possible_versions = [] |
| best_python = (0, 0), '' |
| for python in pythons: |
| version = self.extract_version(python) |
| if version >= (2, 4): |
| possible_versions.append((version, python)) |
| |
| possible_versions.sort() |
| |
| if not possible_versions: |
| raise ValueError('Python 2.x version 2.4 or better is required') |
| # Return the lowest possible version so that we use 2.4 if available |
| # rather than more recent versions. |
| return possible_versions[0][1] |
| |
| |
| def restart(self): |
| python = self.find_desired_python() |
| sys.stderr.write('NOTE: %s switching to %s\n' % |
| (os.path.basename(sys.argv[0]), python)) |
| sys.argv.insert(0, '-u') |
| sys.argv.insert(0, python) |
| os.execv(sys.argv[0], sys.argv) |