How to use multiple versions of Python without uninstallation

前端 未结 15 1545
醉梦人生
醉梦人生 2021-02-05 14:11

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).

相关标签:
15条回答
  • 2021-02-05 15:12

    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.

    0 讨论(0)
  • 2021-02-05 15:15

    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

    0 讨论(0)
  • 2021-02-05 15:16

    You should look into virtualenv. I got to know about it from this blog post, which talks about pip and fabric, also very useful tools for the Python developer.

    0 讨论(0)
提交回复
热议问题