I have a Python file which might have to support Python versions < 3.x and >= 3.x. Is there a way to introspect the Python runtime to know the version which it is running (for example, 2.6 or 3.2.x
)?
How do I detect the Python version at runtime?
The Question :
The Answer 1
Sure, take a look at sys.version
and sys.version_info
.
For example, to check that you are running Python 3.x, use
import sys if sys.version_info[0] < 3: raise Exception("Must be using Python 3")
Here, sys.version_info[0]
is the major version number. sys.version_info[1]
would give you the minor version number.
In Python 2.7 and later, the components of sys.version_info
can also be accessed by name, so the major version number is sys.version_info.major
.
See also How can I check for Python version in a program that uses new language features?
The Answer 2
Try this code, this should work:
import platform print(platform.python_version())
The Answer 3
Per sys.hexversion and API and ABI Versioning:
import sys if sys.hexversion >= 0x3000000: print('Python 3.x hexversion %s is in use.' % hex(sys.hexversion))
The Answer 4
The best solution depends on how much code is incompatible. If there are a lot of places you need to support Python 2 and 3, six
is the compatibility module. six.PY2
and six.PY3
are two booleans if you want to check the version.
However, a better solution than using a lot of if
statements is to use six
compatibility functions if possible. Hypothetically, if Python 3000 has a new syntax for next
, someone could update six
so your old code would still work.
import six #OK if six.PY2: x = it.next() # Python 2 syntax else: x = next(it) # Python 3 syntax #Better x = six.next(it)
Cheers
The Answer 5
Just in case you want to see all of the gory details in human readable form, you can use:
import platform; print(platform.sys.version);
Output for my system:
3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) [GCC 7.2.0]
Something very detailed but machine parsable would be to get the version_info
object from platform.sys
, instead, and then use its properties to take a predetermined course of action. For example:
import platform; print(platform.sys.version_info)
Output on my system:
sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
The Answer 6
Here’s some code I use with sys.version_info
to check the Python installation:
def check_installation(rv): current_version = sys.version_info if current_version[0] == rv[0] and current_version[1] >= rv[1]: pass else: sys.stderr.write( "[%s] - Error: Your Python interpreter must be %d.%d or greater (within major version %d)\n" % (sys.argv[0], rv[0], rv[1], rv[0]) ) sys.exit(-1) return 0 ... # Calling the 'check_installation' function checks if Python is >= 2.7 and < 3 required_version = (2,7) check_installation(required_version)
The Answer 7
To make the scripts compatible with Python2 and 3 i use :
from sys import version_info if version_info[0] < 3: from __future__ import print_function
The Answer 8
Version check example below.
Note that I do not stop the execution, this snippet just:
– do nothing if exact version matches
– write INFO if revision (last number) is different
– write WARN if any of major+minor are different
import sys import warnings def checkVersion(): # Checking Python version: expect_major = 2 expect_minor = 7 expect_rev = 14 if sys.version_info[:3] != (expect_major, expect_minor, expect_rev): print("INFO: Script developed and tested with Python " + str(expect_major) + "." + str(expect_minor) + "." + str(expect_rev)) current_version = str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]) if sys.version_info[:2] != (expect_major, expect_minor): warnings.warn("Current Python version was unexpected: Python " + current_version) else: print(" Current version is different: Python " + current_version)
The Answer 9
Since all you are interested in is whether you have Python 2 or 3, a bit hackish but definitely the simplest and 100% working way of doing that would be as follows:
python
python_version_major = 3/2*2
The only drawback of this is that when there is Python 4, it will probably still give you 3.