Comment faire en sorte que la commande de programme 'python' exécute Python 3?

331

La pythoncommande de programme exécute Python 2. Python 3 peut être exécuté à l'aide de la python3commande. Comment exécuter Python 3 à l'aide de la pythoncommande?

Giri
la source
30
Juste un avertissement: n'essayez pas de changer le lien symbolique / usr / bin / python pour qu'il pointe vers python3 au lieu de 2.7. De nombreux programmes disponibles dans le référentiel Ubuntu exigent que / usr / bin / python soit compatible avec Python 2.x.
Soulsource
1
Ah, maintenant je comprends ce que vous vouliez dire par mise à niveau ... En fait, les développeurs Ubuntu travaillent sur cela: wiki.ubuntu.com/Python/3 "C’est un objectif de publication pour Ubuntu 14.04 LTS de n’avoir que Python 3 sur le CD de bureau. images."
Soulsource
1
Sur une autre note, quiconque vient ici parce qu’il essaie d’apprendre comment utiliser Python 3 comme valeur par défaut peut trouver une utilisation dans la recherche d’environnements virtuels (par exemple, virtualenv) ou de conteneurs (par exemple, LXC ou Docker).
Kevin le
1
Pour en savoir plus sur l'avertissement de soulsource en haut, voir PEP 394, qui normalise les conventions de dénomination pour les exécutables Python coexistants et sur lequel s'appuient (et devrait) les programmeurs et les mainteneurs de paquets Python.
David Foerster
2
@wjandrea, oui, même dans un environnement virtuel, pythondoit rester essentiel python2. Je pensais que mon commentaire était un moyen d'avoir une version Python spécifique à l'application au lieu d'essayer de contourner le système Python.
Kevin

Réponses:

370

Un moyen simple et sûr serait d'utiliser un alias. Placez ce dans ~/.bashrcou ~/.bash_aliasesfichier:

alias python=python3

Après avoir ajouté ce qui précède dans le fichier, exécutez source ~/.bashrcou source ~/.bash_aliases.

Par exemple:

$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ alias python=python3
$ python --version
Python 3.4.3

Pour contourner l'alias, utilisez la commandcommande intégrée:

$ command python --version
Python 2.7.6

Une autre façon de contourner l'alias consiste à utiliser \avant la commande.

$ \python --version 
Python 2.7.6

Pour désactiver l'alias dans le shell courant utilisez la unaliascommande intégrée:

$ unalias python
$ python --version
Python 2.7.6
Radu Rădeanu
la source
1
donc pas d'option "mise à niveau" .. ??
Giri
4
en fait, je veux effacer 2.7 et le remplacer par 3.3. On dirait que c'est une mauvaise idée pour le moment.
Giri
35
+1 il n'y a aucune raison de purger la version 2.7 pour pouvoir utiliser la version 3.3. Comme beaucoup de logiciels dépendent encore de 2.7; continuez juste.
don.joey
6
@begueradj Un alias est totalement différent d'un lien symbolique .
Radu Rădeanu
1
Un mot de prudence: cela peut casser d'autres scripts qui attendent Python 2.7.
kmiklas
85

[Juin 2016] L'endroit recommandé pour obtenir des informations sur la transition est la page officielle Ubuntu Python .


À partir du wiki Ubuntu :

Pour Ubuntu et Debian, nous avons des objectifs de projet en cours pour faire de Python 3 la version par défaut préférée de Python dans les distributions.

Qu'est-ce que cela ne signifie pas :

  • /usr/bin/pythonpointera vers Python 3. Non, cela ne va pas arriver (à moins que PEP 394 ne préconise le contraire, ce qui est douteux pour l'avenir prévisible). /usr/bin/pythonet /usr/bin/python2pointera sur Python 2.7 et /usr/bin/python3sur la dernière version prise en charge de Python 3.

  • Python 2 sera supprimé de l'archive. Non, cela ne va pas arriver . Nous prévoyons que Python 2.7 restera pris en charge et disponible dans Ubuntu assez longtemps, étant donné que PEP 373 promet une prise en charge de la maintenance des correctifs de bogues en amont jusqu’en 2020.

Il n'est pas recommandé de modifier le lien symbolique en raison d'autres dépendances de packages, mais ils "ont des objectifs de projet en cours pour faire de Python 3 la version par défaut préférée de Python dans les distributions".


Pour une utilisation CLI, comme @Radu Radeanu , je vous recommande de mettre un alias dans l'utilisateur ~/.bashrc, le .bash_aliasesfichier (les différents fichiers, y compris ~/.bash_profile,, sont chargés au moins une fois la plupart du temps à des fins d' organisation, mais peut varier selon la plate - forme). Les environnements virtuels Python fonctionnent également bien.

Exemples d'alias:

alias python=python3

ou

alias python='/usr/bin/python3'

Les scripts doivent toujours utiliser quelque chose comme #!/usr/bin/env python3pour la compatibilité croisée.

L'utilisation envest agréable pour une utilisation mixte avec des environnements virtuels.

Note (merci à @wjandrea): les alias font partie du runtime bash, pas de l'environnement utilisateur. Par conséquent, ils ne sont pas disponibles pour le shebang ( #!). Si vous préférez l’alias python = python3, certains utilisateurs program.pysans shebang peuvent être exécutés en appelant l’interpréteur aliasé comme ceci python program.py. L'aliasing peut également être utile pour les systèmes dotés de plusieurs versions de python3 telles que 3.4 et 3.6.

Kevin
la source
1
Cela semble être obsolète maintenant: ils avaient prévu de supprimer python2 dans Xenial, mais ne l’avaient pas fait ensuite.
OrangeDog
1
@ OrangeDog, merci pour la mise à jour. Oui, la page wiki que j'ai citée est maintenant considérée comme obsolète, des progrès supplémentaires ayant été accomplis au cours des deux dernières années pour passer à uniquement Python 3. La nouvelle page qui suit cette progression est la page officielle Ubuntu Python .
Kevin
La "dernière" page est également obsolète en ce qui concerne les projets de Xenial.
OrangeDog
Je ne dirais pas qu'il est "obsolète", mais "il n'a pas été mis à jour récemment". Il semble toujours être le lieu actuel pour garder des messages à ce sujet. Cependant, dans les commentaires ici, je vous serais reconnaissant de toute autre source récente que quiconque pourrait trouver. Ajouter plus de sources à ma réponse, sur la raison pour laquelle il ne faut pas modifier simplement python, n’est pas vraiment pertinent tant que la conversion n’est pas terminée. Même dans ce cas, cela pourrait ne plus être un problème.
Kevin
2
Les alias sont internes à Bash et ne font pas partie de l'environnement. Vous aurez donc toujours besoin de l'utiliser python3dans un shebang python.
wjandrea
28

Mise à jour: J'ai appris que ce n'est pas la bonne façon, car Python2 et Python3 ne sont pas interchangeables.

Vous pouvez essayer l'outil de ligne de commande update-alternatives.

$ sudo update-alternatives --config python

Si vous obtenez l'erreur "pas d'alternative pour python", configurez vous-même une alternative avec la commande suivante:

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

Modifiez le chemin /usr/bin/python3d' accès à votre version de python souhaitée en conséquence.

Webwurst
la source
20
python2 et python3 ne sont pas des alternatives. N'utilisez pas update-alternatives à cette fin.
jobin
Pourquoi ne sont-ils pas? L'un de vous peut-il expliquer pourquoi update-alternativesne convient pas au python? Est-ce à cause de legacy.python.org/dev/peps/pep-0394 ?
Dmitry Grigoryev
11
les alternatives sont des implémentations différentes pour les mêmes fonctionnalités. Python2 et Python3 ne fournissent pas les mêmes fonctionnalités.
Ely
Vous pouvez faire quelque chose comme ceci si vous avez installé manuellement (via ppa ou autre) d'autres versions de python3. sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
David Baucum
C’est ce que j’avais besoin de faire pour un vm 18.04.2 qui n’est pas livré avec python. Merci
Dark Star1
9

Ubuntu, et le reste des distributions Linux d'ailleurs, dépendent encore largement de Python 2.7 pour un certain nombre d'applications et de commandes. Si vous modifiez la référence par défaut de "python" en Python 3.x, un certain nombre de fonctions Python commenceront à générer des erreurs d'assertion.

Par exemple, sous Ubuntu, "pip" pour l'un ne fonctionnerait plus correctement à moins que vous n'ayez directement édité le fichier et modifié le shebang en faisant référence à "#! / Usr / bin / env python2.7". Sur les versions RHEL (Red Hat Enterprise Linux) telles que Red Hat, Fedora et CentOS, la commande "Yum" dépend également de Python 2.7.

Ce que je veux dire par là, c'est que vous feriez en sorte qu'une grande quantité de code commence à générer des erreurs d'assertion afin de pouvoir taper 'python' dans le terminal pour faire référence à Python 3.x.

Vous ferez bien mieux d'utiliser la commande 'python3' dans le terminal et le shebang '#! / Usr / bin / env python3' dans vos fichiers Python 3.x.

Moony
la source
2

Faire

cd ~
gedit .bash_aliases

alors écris soit

alias python=python3

ou

alias python='/usr/bin/python3'

Enregistrez le fichier, fermez le terminal et ouvrez-le à nouveau.
Lien

Brise
la source
1

Vous pouvez créer un lien symbolique /usr/bin/pythonvers python3avec

sudo ln -s /usr/bin/python3 /usr/bin/python

et vous pouvez empêcher l’installation de Python 2 et pip2 en tant que dépendance avec

sudo apt-mark hold python python-pip

Voir les autres réponses pour savoir pourquoi vous ne voudriez peut-être pas faire cela. Ubuntu 18.04+ n’est plus livré avec Python 2, donc ça ne devrait pas être trop grave.

Boris
la source
2
En ce qui concerne "Ubuntu 18.04 n’est plus livré avec Python 2, cela ne devrait donc pas être trop grave". Sur Ubuntu (même dans les versions sur lesquelles Python 2 n’est pas installé par défaut), un exécutable appelé pythonest supposé être Python 2, cela pourrait donc casser certaines choses.
Wjandrea
* python->/usr/bin/python
wjandrea
0
cat > /usr/local/bin/py
#!/bin/dash
python3 "$@"
<CTRL-D>

(à condition que vous ayez la permission d'écrire sur / usr / local / bin)

cat > /usr/local/bin/pyi
#!/bin/dash
python3 -i "$@"
<CTRL-D>

alors vous ne tapez que py (et utilisez py dans #! lignes) pour votre python choisi.

John Allsup
la source
Ne serait-il pas plus simple d'utiliser un lien symbolique? sudo ln -s /usr/bin/python3 /usr/local/bin/py
wjandrea
0

Je trouve très utile de supprimer simplement / usr / bin / python et / usr / bin / pip. Cela oblige tous les programmes à utiliser les commandes "python2" et "python3".

Bien que certains paquets optionnels et obsolètes dépendent #!/usr/bin/pythondu travail, je préfère soumettre des correctifs à ces programmes que de continuer à faire des erreurs étranges et parfois difficiles à corriger.

Erik Aronesty
la source
-1

Vous pouvez utiliser update-alternativespour fournir différentes versions de programmes pouvant être nécessaires à différents moments en raison de problèmes de compatibilité.

Cette réponse est un bon exemple de la façon de configurer pour gérer simultanément différentes versions de gcc / g ++, par exemple.

faites juste la même chose avec python2.7 et python 3.3

dcanelhas
la source
2
Les utilisateurs débutants peuvent ne pas être en mesure d'adapter facilement la réponse liée à une situation différente. En plus de créditer la réponse précédente, il serait bon de définir les étapes nécessaires pour Python.
Chaskes
Voici la solution que j'ai trouvée étape par étape linuxconfig.org/…
woto
Python 2 et 3 ne sont pas des alternatives - même différentes versions mineures ne le sont pas ( par exemple ). Cette méthode peut facilement casser des choses.
Wjandrea
En outre, c’est une copie de cette réponse
wjandrea