AbdealiLoKo
AbdealiLoKo

Reputation: 3317

How to throw exception if script is run with Python 2?

I have a script that should only be run with Python 3. I want to give a nice error message saying that this script should not be run with python2 if a user tries to run it with Python 2.x

How do I do this? When I try checking the Python version, it still throws an error, as Python parses the whole file before executing my if condition.

If possible, I'd rather not make another script.

Upvotes: 10

Views: 2762

Answers (5)

BenValjean
BenValjean

Reputation: 407

None of these properly work as, as others have mentioned SyntaxErrors are parsed first, also doing except SyntaxError does not work either.

The best solution is a wrapper module, but if due to other technical or political reasons you cannot create another module in your code you can do the following very dirty trick:

z, *y=1,2,3,4 #This script requires requires python 3! A Syntax error here means you are running it in python2!

The result in python2.7 will be:

  File "notpython2.py", line 3
    z, *y=1,2,3,4 #This script requires requires python 3! A Syntax error here means you are running it in python2!
       ^
SyntaxError: invalid syntax

Yes the code is ugly, but if anyone can think of a better solution notwithstanding a new module please add it here.

Upvotes: 2

Adrian W
Adrian W

Reputation: 5026

You can use the fact that in Python 2 strings are byte strings, while in Python 3 they are unicode strings. So any of

if ' ' == b' ':
    raise Exception ('Running this script with Python 2 is not supported')

or

if isinstance (b' ', str):
    raise Exception ('Running this script with Python 2 is not supported')

will do. Note that this does not need any imports - just language features.

Upvotes: 0

shashank verma
shashank verma

Reputation: 353

import sys
if (sys.version_info > (2, 0)):
   raise Exception('script should not be run with python2.x')

This will raise error if script is running under 2.x python version

Upvotes: 1

poke
poke

Reputation: 387507

You can write a wrapper start-script in which you only import your actual script and catch for syntax errors:

try:
    import real_module
except SyntaxError:
    print('You need to run this with Python 3')

Then, when real_module.py uses Python 3 syntax that would throw an exception when used with Python 3, the above message is printed out instead.

Of course, instead of just importing the script, you could also first check the version, and then import it when the version is 3. This has the benefit that you will still see syntax errors of your actual script even when you run it with Python 3:

import sys
if sys.version_info[0] < 3:
    print('You need to run this with Python 3')
    sys.exit(1)

import real_module

Upvotes: 14

Haris Kovačević
Haris Kovačević

Reputation: 41

Try this:

import sys
#sys.version gives you version number in this format
#(2, 5, 2, 'final', 0)
version=sys.version_info[0]

if version == 2:
   sys.exit("This script shouldn't be run by python 2 ")

Upvotes: 1

Related Questions