Lorsque j'exécute une commande incorrecte sur mon terminal Ubuntu au lieu de renvoyer "commande introuvable", le terminal ne fait rien et lorsque j'appuie sur Ctrl+C il fait écho à une trace de pile d'exceptions python. Quelque chose ne va pas? Comment puis-je réparer cela?
Par exemple, lorsque je saisis "sdf", cela ne fait rien. "sdf" n'est pas une commande valide.
Mais quand je presse Ctrl+C, il imprime cette trace de pile d’exceptions python.
La trace de la pile est différente à chaque fois.
J'utilise Ubuntu 14.04, donc python2 est la valeur par défaut
$ type python python2 python3
python is /usr/bin/python
python2 is /usr/bin/python2
python3 is hashed (/usr/bin/python3)
$ readlink /usr/bin/python /usr/bin/python2 /usr/bin/python3
python2.7
python2.7
python3.4
$ python --version
Python 2.7.6
$ python3 --version
Python 2.7.6
$ readlink /usr/bin/python3.4
$
Sudo apt-get install --reinstall python
n'a pas aidé.Sudo apt-get install --reinstall python3
a lancé une erreur Mise à jour :
Donc, après avoir essayé plusieurs approches, j'ai fini par réinstaller Ubuntu. Suivez réponse de wjandrea et les commentaires, semblent être sur le point d'identifier le problème.
/etc/bash.bashrc
définit une fonction command_not_found_handle
, qui appelle /usr/lib/command-not-found
, qui est un script Python 3. Ce gestionnaire est appelé pour les commandes que Bash ne peut pas trouver.
Donc, en tant que correctif de bandage, vous pouvez désactiver le gestionnaire:
unset -f command_not_found_handle
Après quelques discussions avec OP, il s’avère que le problème est causé par un exécutable Python 2.7 placé accidentellement dans /usr/bin/python3.4. (Donc ma première mise à jour n’était pas très utile, mais elle est dans révision 4 si vous voulez la lire). Si cela vous arrive, ne redémarrez pas votre ordinateur! Certaines parties de l'interface graphique dépendent de Python 3. Vous allez probablement besoin de garder le terminal ouvert aussi.
BTW, cela explique la boucle infinie lorsqu’on appelle une commande inconnue à l’invite Bash. /usr/lib/command-not-found
contient cette section:
if sys.version < '3':
# We might end up being executed with Python 2 due to an old
# /etc/bash.bashrc.
import os
if "COMMAND_NOT_FOUND_FORCE_PYTHON2" not in os.environ:
os.execvp("python3", [sys.argv[0]] + sys.argv)
Ce qui signifie que lorsqu'il est exécuté par Python 2, il appelle python3
, mais puisque python3
est en fait Python 2, le processus se répète.
OP a fini par réinstaller Ubuntu, mais j'étais curieux et j'ai donc ouvert une machine virtuelle, provoqué un problème similaire (si ce n'est pas le même problème) et résolu le problème.
Causé le problème
Sudo cp /usr/bin/python2.7 /usr/bin/python3.4
Confirmé le problème
python3 --version
, obtenu Python 2.7.6
sdf
, il a fallu appuyer sur Ctrl + C pour arrêter la boucleFixe le:
Sudo apt-get install --reinstall python3.4-minimal
Le package python3.4-minimal
fournit l'exécutable Python 3.4 lui-même. Tous les autres paquets que j'ai vérifiés (python3
, python3.4
, python3-minimal
) dépendent de python3.4-minimal
pour cette raison.
(OP et moi avons trébuché sur cette solution la première fois. Pour plus de détails sur ce que j’ai essayé, ce que j’ai encore foiré, et comment je l’ai corrigé, lisez révision 9 de cette réponse .)