How to use multiple versions of Python without uninstallation

36,159

Solution 1

Install Python 3

Python 3.3 and higher put a py.exe into the windows folder. [link] This executable is used to determine the python version with the first line of the file:

#!/usr/bin/python2.7

will be executed with Python 2.7. You must install the Python 3 version after you installed the other Python versions.

Additional ressources: https://docs.python.org/3/using/windows.html#customization

pywin https://pypi.python.org/pypi/pywin

Old Solution

I guess you use windows. I solved this problem with a hack:

Every time I start python on windows a python.bat will be used. This starts a python.py that analyses the file for the header after #! for the python version.

To start example.py I type into the console

python example.py

but it could also be started per klick.

this is my python file C:\bin\python.py

#!/usr/bin/env python2
import sys
import os
args = sys.argv
if len(args) <= 1:
    # no arguments
    # start python console
    i = os.system('C:\bin\python2.bat' + " ".join(args[1:]))
    if type(i) != int:
        i = 0
    exit(i)

def analyse(filename, default = ''):
    '''=> '2', '3', default '''
    try:
        f = open(filename)
    except IOError:
        # file not found
        return default
    firstLine = f.readline()
    if firstLine.startswith('#!'):
        if 'python2' in firstLine:
            return '2'
        if 'python3' in firstLine:
            return '3'
        i = firstLine.find(' ')
        if i != -1:
            # analyse from end of path on
            in2 = '2' in firstLine[i:]
            in3 = '3' in firstLine[i:]
            if in2 and not in3:
                return '2'
            if in3 and not in2:
                return '3'
        else:
            # analyse path
            in2 = '2' in firstLine
            in3 = '3' in firstLine
            if in2 and not in3:
                return '2'
            if in3 and not in2:
                return '3'
    return default



no = analyse(args[1], default = '2')
if args[1][-1:] == 'w':
    # python win
    cmd = 'C:\bin\pythonw%s.bat'
else:
    cmd = 'C:\bin\python%s.bat'
i = os.system(cmd % no + ' ' + " ".join(args[1:]))

if type(i) != int:
    i = 0
exit(i)

This is the C:\bin\python.bat file

@echo off
C:\bin\python2 C:\bin\python.py %*
rem this may also work:
rem C:\bin\python.py %*

and in every file you start you have to put either

#!/bin/env/python3

or

#!/bin/env/python2

default is python2

Then I added those files to the folder:

C:\bin\python2.bat

@echo off
C:\python27\python.exe %*

C:\bin\pythonw2.bat

@echo off
C:\python27\pythonw.exe %*

C:\python3.bat

@echo off
C:\python32\pythonw.exe %*

C:\bin\pythonw3.bat

@echo off
C:\python32\pythonw.exe %*

If you are using python26 instead if python27 then you need to change

C:\python27 

to

C:\python26

and so on. Same with python not using python 32.

You may also want to start python files per klick

then do this:

klick right on a .py file -> open with -> select C:\bin\python.bat

If you get problems contact me or leave a comment.

Solution 2

You simply install multiple versions in separate directories, and then you run the python program with the Python version you want to use. Like so:

C:\Python26\Python.exe thescript.py

Or similar.

What virtualenv does is that it gives you many separate "virtual" installations of the same python version. That's a completely different issue, and hence it will not help you in any way.

Solution 3

For those using windows, if you're not averse to using PowerShell, you can install python 2 and 3 separately as mentioned in other answers. Then you can do this:

Set-Alias python27 [some path]\python27\python.exe 
Set-Alias python33 [some path]\python33\python.exe

To create an alias for running each version.

Keeping aliases around is described in this link: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_aliases#saving-aliases

In order to successfully load the profile that that link would have you create, you may need to change your execution policy.

Set-ExecutionPolicy RemoteSigned

should do the trick, but if you want to know more about execution policies you may want to follow this link: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_execution_policies

Solution 4

Use virtualenv, which allows you to create dynamic python environments. Check out python's page here.

http://pypi.python.org/pypi/virtualenv

Related answered question on installing packages inside virtualenv on windows (as opposed to system-wide) Can I install Python windows packages into virtualenvs?

Solution 5

Use Pythonbrew, its super easy to install, and allows you to very easily install, and switch between, or temporarily use different python versions safely.

Once pythonbrew is installed:

#to install new python versions is as simple as:
pythonbrew install 2.7.2 3.2
#to use a particular version in the current shell:
pythonbrew use 3.2
#to uninstall:
pythonbrew uninstall 2.7.2
Share:
36,159
Learnerbeaver
Author by

Learnerbeaver

Python explorer for text mining, modelling etc..

Updated on August 20, 2020

Comments

  • Learnerbeaver
    Learnerbeaver over 3 years

    I am faced with a unique situation, slightly trivial but painful.

    I need to use Python 2.6.6 because NLTK is not ported to Python 3 (that's what I could gather).

    In a different code(which am working concurrently), there is a collections counter function which is available only in Python 3 but not in Python 2.6.6.

    So, each time I switch between the two codes, I need to install & uninstall the versions. That's such a waste of time.

    Any suggestions on how I specify which version I want to use?