0
votes

Comment extraire par programmation la version Python dans un script shell?

Avec python --version comme entrée dans le terminal, je voudrais confirmer (également dans le shell sous forme de programmation shell) si les versions de python installées sont 3 ou plus. Par exemple,

Python 3.2.1

donnerait True ou une forme de confirmation, où comme python2.2p1 ou Python 2.1.4 donnerait False .

J'ai essayé d'utiliser regex via sed ou grep, mais je ne peux pas l'obtenir.

Notez que c'est une question différente de ce que certains pensent être un doublon, car Je demande le code de programmation shell qui peut automatiser la confirmation de l'installation de python3 ou supérieur, pas un moyen de le vérifier manuellement (il suffit de saisir python --version ).


7 commentaires

Voir stackoverflow.com / questions / 8917885 /…


N'est-ce pas le résultat lorsque Python n'est pas installé?


Dans votre cas, il semble que python ne soit pas du tout installé. Pour capturer ce cas, vous devez demander à votre gestionnaire de paquets au lieu d'utiliser python -V . Quel gestionnaire de packages utilisez-vous? est-ce apt ? De plus, si vous souhaitez utiliser la version 3, appelez python3 au lieu de simplement python .


Cette sortie provient de la Ubuntu command-not-found < / a> hook pour Bash. Il ne devrait même pas fonctionner à partir d'un script, à ma connaissance.


Oops. Tu as raison. Édité.


Ce n'est pas une dupe, du moins pas de la cible de dupe choisie. La question ici n'est pas de savoir comment faire en sorte que Python rapporte sa version (le sujet de la cible dupe et toutes ses réponses), mais plutôt comment écrire un script shell qui interprète cette sortie (et peut-être d'autres) .


Cela semble être une tâche extrêmement triviale - modifiez votre question pour montrer ce que vous avez essayé et indiquer dans quelle partie vous avez besoin d'aide .


3 Réponses :


-2
votes

Voici un exemple de script awk pour faire le travail:

echo $(python --version) | awk 'BEGIN{found="false"}/python-3/{found="true"}END{print found}'


4 commentaires

C'est une utilisation inutile de echo . Et cela ne fait rien pour révéler la version dont vous disposez.


echo est utilisé pour fournir une sortie standard à awk. Sans la commande echo, awk requiert un fichier d'entrée.


Non, vous vous trompez complètement. Si Python imprime les informations de version sur la sortie standard, le tube les alimente à l'entrée standard d'Awk aussi bien qu'à partir de echo ; et si ce n'est pas le cas, votre écho n'aide pas du tout.


... et ce n'est pas le cas. python --version dirige sa sortie vers stderr, pas vers stdout. De plus, sa sortie d'erreur lorsque python est un cpython version 3 ne correspond pas à / python3 / .



2
votes

Avec la version python comme entrée dans le terminal, j'aimerais confirmer (également dans le shell sous forme de programmation shell) si les versions de python installées sont 3 ou plus.

Si la commande python lance une version de cpython, alors la sortie de python --version (vers son stderr, pas stdout) aura la forme: p>

if python --version 2>&1 | grep -q '^Python 3\.'; then
  # It's python 3 ...
else
  # It's not python 3; maybe not installed
fi

Vous pouvez tester cela dans un script shell comme ceci:

Python X.Y.Z

Notez que la sortie que vous avez initialement présentée dans la question indiquée que Python n'a pas du tout été installé. L'approche ci-dessus exécutera la branche else dans cet événement. Notez également qu'il est possible que Python soit installé avec un nom différent - par exemple, sur le système où je tape ceci, python est Python 2.7.5, mais Python 3.4.8 est disponible via la commande python3 . Vous pouvez étendre ce qui précède pour tester quelques noms alternatifs possibles pour Python 3, mais vous ne pouvez pas effectuer en toute sécurité, de manière fiable ou efficace un test exhaustif pour savoir si Python 3 est installé du tout, sous n'importe quel nom ou chemin.

blockquote >

1 commentaires

Après avoir reconsidéré, je pense que cela devrait être la réponse acceptée, et ma solution est trop élaborée compte tenu de l'exigence.



1
votes

Le moyen le plus simple de le faire dans Bash est d'utiliser sort -V .

Pour résoudre le problème de la comparaison des chaînes de version en général dans bash, voici un simple compare () fonction qui accepte deux arguments a et b et renvoie true si a

`-V, --version-sort`

Sortie:

if python3_installed ; then
  # yes it is!
else
  # ...
fi

(Ces tests unitaires supposons que shunit2 est bien sûr installé.)

À propos de la fonction: p>

Il fait simplement écho à $ a puis $ b sur deux lignes distinctes, conduit dans sort -V , et prend la tête. Si la tête est égale au côté gauche, true est renvoyé; sinon, s'il est égal au côté droit, false est renvoyé.

Dans votre question, vous avez mentionné que vous voulez vraiment savoir si Python 3 ou supérieur est installé, vous pouvez donc le modifier et avoir quelque chose comme ceci à la place:

python3_installed() {
  local a b
  a=$(python --version 2>&1 | perl -pe 's/python *//i') ; b=3
  [ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$b" ]
}

Cette fonction calculera la version réelle de Python installée, et la comparera à "3" en utilisant sort -V et retournera false à moins que 3 ou plus ne soient installés.

Notez l'utilisation de Perl pour effectuer une recherche et un remplacement de regex insensible à la casse. (Tous les sed n'ont pas la capacité de ne pas tenir compte de la casse.)

La grande chose à faire de cette façon est que vous pouvez alors avoir un code lisible lorsque vous l'appelez, comme:

â–¶ bash test.sh
test22p1
test214
test300
test372

Ran 4 tests.

OK


0 commentaires