web-dev-qa-db-fra.com

Mes commandes de terminal Ubuntu semblent s'exécuter sur python

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.

When I enter an invalid command, terminal does nothing.

Mais quand je presse Ctrl+C, il imprime cette trace de pile d’exceptions python.

When I press ctr-C it is echo-ing some python exception stack

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.

2
Ishtiaque Khan

/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

Mise à jour 2:

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.

Mise à jour 3:

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.

  1. Causé le problème

    Sudo cp /usr/bin/python2.7 /usr/bin/python3.4
    
  2. Confirmé le problème

    • Ran python3 --version, obtenu Python 2.7.6
    • Essayé de courir sdf, il a fallu appuyer sur Ctrl + C pour arrêter la boucle
  3. Fixe 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 .)

4
wjandrea