How to use multiple versions of Python without uninstallation

风流意气都作罢 提交于 2019-11-30 13:54:51

问题


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?


回答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.




回答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.




回答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




回答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?




回答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



回答6:


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.




回答7:


This page has an implementation of collections.Counter that works for Python 2.6:

  • http://code.activestate.com/recipes/576611/



回答8:


not sure this is what you want, but I used to live with this for a long time http://www.portablepython.com/




回答9:


The OP request is a little outdated, especially now that NLTK does have a py3.x port. see Install nltk 3.0 on Ubuntu 13.10 using tar.gz download

Here's how you can get python3 to work with NLTK.

$ sudo apt-get install python3-pip
$ sudo pip3 install pyyaml
$ wget http://www.nltk.org/nltk3-alpha/nltk-3.0a3.tar.gz
$ tar -xzvf nltk-3.0a3.tar.gz
$ cd nltk-3.0a3/
$ sudo python3 setup.py install
$ python3
>>> import nltk
>>> from nltk.corpus import brown
>>> print(brown.sents()[0])
['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', 'Friday', 'an', 'investigation', 'of', "Atlanta's", 'recent', 'primary', 'election', 'produced', '``', 'no', 'evidence', "''", 'that', 'any', 'irregularities', 'took', 'place', '.']



回答10:


I do use at least 3 or 4 versions of Python on my machines (Windows). The installers from http://python.org/ automatically placed them in:

c:\Python26
c:\Python27
c:\Python32

and

c:\Python24

on one machine. I mostly use Python 2.7 because some applications use wxPython and also for the older console code. This python.exe was not renamed. By the way, the Python 2.7 also supports collections.Counter.

The c:\Python26 and c:\Python24 are not included in my PATH. In c:\Python32\, the exe was renamed to py.exe. This way, python some.py starts Python 2.7, and py another.py starts Python 3.2.




回答11:


You can specify the version you want in the shebang line. I just ran into this when a VM my Ops guy set up had Python 2.6 in /usr/bin/python2.6, and I needed 2.7 for a few features. He installed it for me at /usr/bin/python2.7.

My old shebang:

#!/usr/bin/env python

stopped working, because /usr/bin/python was a link to /usr/bin/python2.6. What wound up fixing the problem, and working across Windows, Linux, and OSX, was changing the shebang to:

#!/usr/bin/env python2.7

It should work for any version, I believe.




回答12:


If you're talking about shell, as in linux, if you install python 3, you can invoke it separately with the python3 command. Python 2 is just invoked using python.

At least this is my experience with Ubuntu-like systems, I haven't used other Linux environments.

I realize this question is almost a year old, but NLTK has been ported to Python 3 (or at least that was true as of writing this).




回答13:


Take a look on WinPython, a nice portable/installable python distribution for Windows.

Portable: preconfigured, it should run out of the box on any machine under Windows (without any requirement) and the folder containing WinPython can be moved to any location (local, network or removable drive) with most of the application settings

Flexible: one can install (or should I write "use" as it's portable) as many WinPython versions as necessary (like isolated and self-consistent environments), even if those versions are running different versions of Python (2.7, 3.3) or different architectures (32bit or 64bit) on the same machine

It also allows you to register and unregister easily a given python version as the system default one.

But even working as portable, you can make a shortcut of the python executable and put it somewhere in your path. Just name the shortcuts of different versions different names. Then you can just use:

python_3_64bit_shortcut your_program.py



回答14:


You can use py launcher, that is installed with python distributable:

py -2    # default python 2
py -2.7  # specifically python 2.7
py -3    # default python 3
py -3.7  # specifically python 3.7

If you need to execute a script with a specific version you can do following:

py -3.7 my_script.py



回答15:


Simplest solution : Rename the file in where your path is locations e.g:



来源:https://stackoverflow.com/questions/10464301/how-to-use-multiple-versions-of-python-without-uninstallation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!