问题
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