[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Check Python version from inside script? Run Pythons script in v2 compatibility mode?

On Fri, 7 Jul 2017 04:30 pm, Ben S. wrote:

> Can I somehow check from inside a Python script if the executing Python engine
> is major version v2 or v3?

Yes you can, but generally speaking you shouldn't.

import sys
if sys.version_info >= (3,):  # the comma is important
    print("version 3")

    print("version 2")

But keep in mind that your code must be syntactically valid for the running
version regardless of the result of the test. This will **NOT** work:

import sys
if sys.version_info >= (3,):  # the comma is important
    print("version 3")

    print "version 2"  # Python 2 syntax

Earlier I said that in general you shouldn't test for the version. Normally you
should test for a specific feature, not for the version number. For example,
suppose I want to use the "reduce()" function. In Python 2 it is a built-in
function, but in Python 3 it is moved into the functools module.

Don't do this:

if sys.version_info >= (3,):
    from functools import reduce

This is better:

except NameError:
    # reduce no longer defined as a built-in
    from functools import reduce

That's now not only backwards compatible, but it is forward compatible: if
Python changes in the future to bring reduce back into the built-in functions,
your code will automatically keep working.

Dealing with syntax changes in hybrid version 2 + 3 code is quite tricky. It can
be done, but it is painful, even for experts.

> Additional question:
> Is there a way to execute a python script with v3 python engine in v2
> compatibility mode? I am thinking about a command parameter like (python.exe
> is v3.*):
>   python.exe -execute_as_v2 myscript.py

No. Python 3 is always Python 3, and Python 2 is always Python 2. But what you
can do is install both, and then call 

python2.exe myscript.py

python3.exe anotherscript.py

?Cheer up,? they said, ?things could be worse.? So I cheered up, and sure
enough, things got worse.