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
).
3 Réponses :
Voici un exemple de script awk pour faire le travail:
echo $(python --version) | awk 'BEGIN{found="false"}/python-3/{found="true"}END{print found}'
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 /
.
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 depython --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 fiVous pouvez tester cela dans un script shell comme ceci:
Python X.Y.ZNotez 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
blockquote >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 commandepython3
. 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.
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.
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
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-ceapt
? De plus, si vous souhaitez utiliser la version 3, appelezpython3
au lieu de simplementpython
.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 .