104 votes

Détecter la version de python dans le shell script.

J'aimerais détecter si python est installé sur un système Linux et si oui, quelle version de python est installée.

Comment puis-je le faire ? Existe-t-il quelque chose de plus gracieux que d'analyser la sortie de "python --version" ?

4 votes

Pourquoi python --version n'est pas gracieux ? Peut-être /usr/bin/env python --version ?

5 votes

Ce que je voulais dire par "non gracieux", c'est que le format de la chaîne peut changer à l'avenir, ce qui invaliderait l'analyse de la chaîne.

1 votes

Python 2.4 renvoie une erreur pour python --version . Vous devez utiliser python -V .

3voto

Nikita Points 3611

Pour vérifier si TOUT Python est installé (en considérant qu'il est sur le PATH), c'est aussi simple que :

if which python > /dev/null 2>&1;
then
    #Python is installed
else
    #Python is not installed
fi

El > /dev/null 2>&1 est là juste pour supprimer la sortie.

Pour obtenir également les numéros de version :

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

Exemple de sortie avec Python 3.5 installé : "Python version 3.5.0 est installé".

Note 1 : Le awk '{print $2}' ne fonctionnera pas correctement si Python n'est pas installé, il faut donc soit l'utiliser à l'intérieur de la vérification comme dans l'exemple ci-dessus, soit utiliser grep comme suggéré par Sohrab T . Bien que grep -P utilise la syntaxe regexp de Perl et peut avoir quelques problèmes de portabilité.

Note 2 : python --version o python -V peut ne pas fonctionner avec les versions de Python antérieures à 2.5. Dans ce cas, utilisez python -c ... comme suggéré dans d'autres réponses.

3voto

freedev Points 3367

Cela renvoie juste 2.7 , 3.6 o 3.9

python -c 'import sys; print(".".join(map(str, sys.version_info[0:2])))'

ce qui est ce dont vous avez généralement besoin...

2voto

Meir Gabay Points 99

Si vous avez besoin d'un script bash script, qui renvoie "NoPython" si Python n'est pas installé, et avec la référence Python s'il est installé, alors vous pouvez utiliser ce qui suit check_python.sh script.

  • Pour comprendre comment l'utiliser dans votre application, j'ai aussi ajouté my_app.sh .
  • Vérifiez que cela fonctionne en jouant avec PYTHON_MINIMUM_MAJOR y 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+')";

2voto

Andrey Semakin Points 307

Une autre façon d'imprimer la version de Python d'une manière lisible par une machine avec les numéros de version majeure et mineure uniquement. Par exemple, au lieu de "3.8.3", il affichera "38", et au lieu de "2.7.18", il affichera "27".

python -c "import sys; print(''.join(map(str, sys.version_info[:2])))"

Fonctionne à la fois pour Python 2 et 3.

2voto

La méthode la plus simple serait :

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}'`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X