Reputation: 2009
I'd like to detect if python is installed on a Linux system and if it is, which python version is installed.
How can I do it? Is there something more graceful than parsing the output of "python --version"
?
Upvotes: 112
Views: 126069
Reputation: 138
Make below changes to do python version change
Upvotes: 0
Reputation: 1
The below code snippets are being used by me to check the required Python version before calling the Python script. It will exit if the Python version doesn't meet the requirement.
#!/usr/bin/bash
REQUIRED_PV=3.8
/usr/bin/env python3 -V 2>/dev/null | gawk -F'[ .]' -v req_pv="${REQUIRED_PV}" '{
cur_pv_major=int($2)
cur_pv_minor=int($3)
split(req_pv, tmp, ".")
req_pv_minor=int(tmp[2])
if (cur_pv_major == 0 || cur_pv_minor < req_pv_minor) {
printf "MY_SCRIPT requires Python %s or greater!\n", req_pv
exit 1
}
}' || exit 1
/usr/bin/env python3 MY_SCRIPT "$@"
/usr/bin/env python3 -V
is for example Python 3.6.8
.gawk
will split it with the delimiter
(A blank space) and .
(A dot) into Python
, 3
, 8
, and 10
.3
) is null, which means there's no python3 in $PATH
.10
) is lower than the required minor number.Upvotes: 0
Reputation: 725
If you need to check if version is at least 'some version', then I prefer solution which doesn't make assumptions about number of digits in version parts.
VERSION=$(python -V 2>&1 | cut -d\ -f 2) # python 2 prints version to stderr
VERSION=(${VERSION//./ }) # make an version parts array
if [[ ${VERSION[0]} -lt 3 ]] || [[ ${VERSION[0]} -eq 3 && ${VERSION[1]} -lt 5 ]] ; then
echo "Python 3.5+ needed!" 1>&2
# fail ...
fi
This would work even with numbering like 2.12.32 or 3.12.0, etc. Inspired by this answer.
Upvotes: 1
Reputation: 143
We first need to detect the latest available interpreter:
for i in python python{1..9}; do which $i >/dev/null && pybin=$i ;done
[[ -n $pybin ]] && echo "found $pybin" || echo "python not found"
Example output:
found python3
If we want to then do something with the version string:
v=$($pybin -V | cut -d' ' -f2)
Full string:
echo ${v}
3.8.10
Only major + minor version:
echo ${v%.*}
3.8
Only major version:
echo ${v%%.*}
3
Upvotes: 0
Reputation: 30027
2.7
, 3.6
or 3.9
python -c 'import sys; print(".".join(map(str, sys.version_info[0:2])))'
which is what you usually you need...
Upvotes: 4
Reputation: 39790
The easiest way would be:
if ! python3 --version ; then
echo "python3 is not installed"
exit 1
fi
# In the form major.minor.micro e.g. '3.6.8'
# The second part excludes the 'Python ' prefix
PYTHON_VERSION=`python3 --version | awk '{print $2}'`
Upvotes: 2
Reputation: 3286
In case you need a bash script, that echoes "NoPython" if Python is not installed, and with the Python reference if it is installed, then you can use the following check_python.sh
script.
my_app.sh
.PYTHON_MINIMUM_MAJOR
and PYTHON_MINIMUM_MINOR
check_python.sh
#!/bin/bash
# Set minimum required versions
PYTHON_MINIMUM_MAJOR=3
PYTHON_MINIMUM_MINOR=6
# Get python references
PYTHON3_REF=$(which python3 | grep "/python3")
PYTHON_REF=$(which python | grep "/python")
error_msg(){
echo "NoPython"
}
python_ref(){
local my_ref=$1
echo $($my_ref -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor);')
}
# Print success_msg/error_msg according to the provided minimum required versions
check_version(){
local major=$1
local minor=$2
local python_ref=$3
[[ $major -ge $PYTHON_MINIMUM_MAJOR && $minor -ge $PYTHON_MINIMUM_MINOR ]] && echo $python_ref || error_msg
}
# Logic
if [[ ! -z $PYTHON3_REF ]]; then
version=($(python_ref python3))
check_version ${version[0]} ${version[1]} $PYTHON3_REF
elif [[ ! -z $PYTHON_REF ]]; then
# Didn't find python3, let's try python
version=($(python_ref python))
check_version ${version[0]} ${version[1]} $PYTHON_REF
else
# Python is not installed at all
error_msg
fi
my_app.sh
#!/bin/bash
# Add this before your app's code
PYTHON_REF=$(source ./check_python.sh) # change path if necessary
if [[ "$PYTHON_REF" == "NoPython" ]]; then
echo "Python3.6+ is not installed."
exit
fi
# This is your app
# PYTHON_REF is python or python3
$PYTHON_REF -c "print('hello from python 3.6+')";
Upvotes: 2
Reputation: 2656
Adding to the long list of possible solutions, here's a similar one to the accepted answer - except this has a simple version check built into it:
python -c 'import sys; exit(1) if sys.version_info.major < 3 and sys.version_info.minor < 5 else exit(0)'
this will return 0 if python is installed and at least versions 3.5
, and return 1
if:
3.5
To check the value, simply compare $?
(assuming bash
), as seen in other questions.
Beware that this does not allow checking different versions for Python2
- as the above one-liner will throw an exception in Py2. However, since Python2
is on its way out the door, this shouldn't be a problem.
Upvotes: 8
Reputation: 2755
Yet another way to print Python version in a machine-readable way with major and minor version number only. For example, instead of "3.8.3" it will print "38", and instead of "2.7.18" it will print "27".
python -c "import sys; print(''.join(map(str, sys.version_info[:2])))"
Works for both Python 2 and 3.
Upvotes: 2
Reputation: 16361
Detection of python version 2+ or 3+ in a shell script:
# !/bin/bash
ver=$(python -c"import sys; print(sys.version_info.major)")
if [ $ver -eq 2 ]; then
echo "python version 2"
elif [ $ver -eq 3 ]; then
echo "python version 3"
else
echo "Unknown python version: $ver"
fi
Upvotes: 6
Reputation: 1201
Here is another solution using hash to verify if python is installed and sed to extract the first two major numbers of the version and compare if the minimum version is installed
if ! hash python; then
echo "python is not installed"
exit 1
fi
ver=$(python -V 2>&1 | sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/')
if [ "$ver" -lt "27" ]; then
echo "This script requires python 2.7 or greater"
exit 1
fi
Upvotes: 20
Reputation: 6331
To check if ANY Python is installed (considering it's on the PATH), it's as simple as:
if which python > /dev/null 2>&1;
then
#Python is installed
else
#Python is not installed
fi
The > /dev/null 2>&1
part is there just to suppress output.
To get the version numbers also:
if which python > /dev/null 2>&1;
then
#Python is installed
python_version=`python --version 2>&1 | awk '{print $2}'`
echo "Python version $python_version is installed."
else
#Python is not installed
echo "No Python executable is found."
fi
Sample output with Python 3.5 installed: "Python version 3.5.0 is installed."
Note 1: The awk '{print $2}'
part will not work correctly if Python is not installed, so either use inside the check as in the sample above, or use grep
as suggested by Sohrab T. Though grep -P
uses Perl regexp syntax and might have some portability problems.
Note 2: python --version
or python -V
might not work with Python versions prior to 2.5. In this case use python -c ...
as suggested in other answers.
Upvotes: 3
Reputation: 3923
You can use the platform module which is part of the standard Python library:
$ python -c 'import platform; print(platform.python_version())'
2.6.9
This module allows you to print only a part of the version string:
$ python -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor); print(patch)'
2
6
9
Upvotes: 16
Reputation: 653
I used Jahid's answer along with Extract version number from a string to make something written purely in shell. It also only returns a version number, and not the word "Python". If the string is empty, Python is not installed.
version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$version" ]]
then
echo "No Python!"
fi
And let's say you want to compare the version number to see if you're using an up to date version of Python, use the following to remove the periods in the version number. Then you can compare versions using integer operators like, "I want Python version greater than 2.7.0 and less than 3.0.0". Reference: ${var//Pattern/Replacement} in http://tldp.org/LDP/abs/html/parameter-substitution.html
parsedVersion=$(echo "${version//./}")
if [[ "$parsedVersion" -lt "300" && "$parsedVersion" -gt "270" ]]
then
echo "Valid version"
else
echo "Invalid version"
fi
Upvotes: 21
Reputation: 17681
You can use this command in bash:
PYV=`python -c "import sys;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(t)";`
echo $PYV
Upvotes: 10
Reputation: 750
using sys.hexversion could be useful if you want to compare version in shell script
ret=`python -c 'import sys; print("%i" % (sys.hexversion<0x03000000))'`
if [ $ret -eq 0 ]; then
echo "we require python version <3"
else
echo "python version is <3"
fi
Upvotes: 10
Reputation: 500147
You could use something along the following lines:
$ python -c 'import sys; print(sys.version_info[:])'
(2, 6, 5, 'final', 0)
The tuple is documented here. You can expand the Python code above to format the version number in a manner that would suit your requirements, or indeed to perform checks on it.
You'll need to check $?
in your script to handle the case where python
is not found.
P.S. I am using the slightly odd syntax to ensure compatibility with both Python 2.x and 3.x.
Upvotes: 95
Reputation: 363467
python -c 'import sys; print sys.version_info'
or, human-readable:
python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))'
Upvotes: 41