Warum wird diese Python-Fehlermeldung generiert, wenn ich einen Unsinn-Befehl eingebe?

16

Immer wenn ich einen "Unsinn" -Befehl eingebe, wird diese Python-Fehlermeldung generiert. Normale Befehle funktionieren einwandfrei. Irgendeine Idee, wie man das debuggt?

$ somenonexistingcommand
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site.py", line 553, in <module>
    main()
  File "/usr/local/lib/python2.7/site.py", line 535, in main
    known_paths = addusersitepackages(known_paths)
  File "/usr/local/lib/python2.7/site.py", line 268, in addusersitepackages
    user_site = getusersitepackages()
  File "/usr/local/lib/python2.7/site.py", line 243, in getusersitepackages
    user_base = getuserbase() # this will also set USER_BASE
  File "/usr/local/lib/python2.7/site.py", line 233, in getuserbase
    USER_BASE = get_config_var('userbase')
  File "/usr/local/lib/python2.7/sysconfig.py", line 535, in get_config_var
    return get_config_vars().get(name)
  File "/usr/local/lib/python2.7/sysconfig.py", line 434, in get_config_vars
    _init_posix(_CONFIG_VARS)
  File "/usr/local/lib/python2.7/sysconfig.py", line 298, in _init_posix
    raise IOError(msg)
IOError: invalid Python installation: unable to open /usr/include/python2.7/pyconfig.h (No such file or directory)
$ echo this works fine, however
this works fine, however
$

BEARBEITEN - Nachdem ich mein / usr / bin / python repariert habe, erhalte ich jetzt diese andere Python-Fehlermeldung:

$ yetanothernonexistingcommand
Traceback (most recent call last):
  File "/usr/lib/command-not-found", line 10, in <module>
    import CommandNotFound
ImportError: No module named CommandNotFound

Irgendwie wird Python ausgeführt, wenn ich einen Befehl falsch eingebe.

ripper234
quelle
1
@ Ripper: Interessant. Ein paar streunende Beobachtungen. Hat Ihre .bashrc irgendetwas mit Python zu tun? Erhalten Sie das gleiche Verhalten mit anderen Benutzerkonten? Warum haben Sie Python 2.7 lokal installiert? Was ist das offizielle Standard-Python für diese Installation, und wenn nicht 2.7, haben Sie es installiert? Welche Ubuntu-Version ist das?
Faheem Mitha
@ Faheem - Ich sehe in .bashrc nichts, was mit Python zu tun hat. Ich habe Python lokal installiert. Ich weiß, dass auf der Maschine zwei weitere Pythons installiert sind. Ich habe Ubuntu 10.10 installiert.
Ripper234
Dies riecht ein bisschen wie eine Python-Installation, die vom rechten Weg abkommt. Welche offiziellen Systempythons sind installiert und warum haben Sie 2.7 lokal installiert? Ist es nicht eine der offiziell erhältlichen Versionen?
Faheem Mitha
@Faheem - Ich verstehe deine Frage nicht. Was meinst du mit "offiziell"? Ich brauchte Python 2.7, also habe ich es installiert. Ich bin der Administrator dieser Box. Ich habe Python installiert, indem ich make / make install gemacht habe, habe nichts faul gemacht (glaube ich).
Ripper234
@ Ripper: Das heißt, Ubuntu hat es als Binärpaket bereitgestellt. Welches Python erhalten Sie, wenn Sie Python eingeben?
Faheem Mitha

Antworten:

12

Ok, das macht die Sache etwas klarer. command-not-foundist ein Python-Programm, das ausgeführt wird, wenn Ihr Befehl auf dem System nicht gefunden wird. (Ihre Funktion ist es, Alternativen und Korrekturen im Falle von Tippfehlern usw. vorzuschlagen.) Siehe /usr/bin/command-not-found. Es versucht, das CommandNotFoundModul zu importieren und kann dies nicht. Dies weist eindeutig auf eine fehlerhafte Python-Installation hin. Ich bin nicht so vertraut mit command-not-found, aber ich denke, dass das Problem durch das Reparieren Ihrer Python-Installation behoben werden kann.

Um es ein wenig zu erläutern: Wahrscheinlich befindet sich das command-not-foundModul an einem Ort, an dem Ihr Standard-Python nicht danach sucht. Im Grunde genommen ein Pfadproblem.

Debug-Vorschläge:

1) Zu Beginn, wovon wird ausgegeben?

$ which python

und zu welchem ​​Paket / zu welcher Installation gehört diese Datei?

2) Was ist die Ausgabe für Ihre Installation, die dem folgenden Code entspricht? Der Pfad hier ist der Importpfad dieses Pythons.

$ python
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode']
Faheem Mitha
quelle
1
Eine mögliche Lösung ist # apt-get remove command-not-found...
Simon
"Python-Installation vermasselt" - jede Idee, was genau fehlt. Ist CommandNotFound ein Kern-Python-Modul oder kann / sollte ich es separat installieren?
Ripper234
@ripper: CommandNotFound ist Teil des Pakets command-not-found , das bereits auf Ihrem Computer installiert sein muss, sonst wird diese Meldung nicht angezeigt . Sie können dies jedoch leicht überprüfen, indem Sie den Paketmanager abfragen. Befehl dpkg -l-not-found. Ihr Problem ist, dass Ihre Standard-Python-Installation dieses Modul nicht sieht. Ich werde oben einige Schritte zum Debuggen hinzufügen. Andere können sich gerne ändern und korrigieren.
Faheem Mitha
Siehe diese Folgefrage
unix.stackexchange.com/questions/9711/…
Die Links command-not-foundscheinen kaputt zu sein (obwohl es schwer zu sagen ist, ob "Fehler" das erwartete Ergebnis bei der Suche nach "Befehl nicht gefunden" ist ...)
Nikana Reklawyks
2

Ich bin darauf gestoßen, als ich von der Version 2.6, die mit meiner Ubuntu-Installation geliefert wurde, auf 3.2 Python umgestiegen bin und die Standardalternative auf 3.2 anstatt 2.6 gesetzt habe.

Wenn Sie sich Ihre /etc/bash.bashrcDatei ansehen, gibt es eine Zeile, in der Sie aufgefordert werden, dieses Python-Skript auszuführen, um nach Alternativen in den Repos zu suchen. Es gibt ein Paket dafür, aber Sie können das Paket nach dem Upgrade nicht mehr entfernen. Ich ziehe einfach die /usr/share/command-not-foundund /usr/lib/command_not_found_handlerund meinen Begriff neu gestartet und es funktioniert wie good ol‘bash: command not found.

RoboticGolem
quelle
6
Wenn Sie den command_not_foundHandler deaktivieren möchten , sollten Sie sich nicht damit anlegen /usr(dies kann dazu führen, dass nachfolgende Upgrades fehlschlagen oder durch nachfolgende Upgrades rückgängig gemacht werden). Ändern Sie stattdessen /etc/bash.bashrc. Oder deaktivieren Sie dies in Ihrem eigenen ~/.bashrcmit unset -f command_not_found_handle.
Gilles 'SO- hör auf böse zu sein'
Insbesondere /etc/bash.bashrcwird vom bashPaket bereitgestellt, sodass Sie Aktualisierungen für dieses Paket unterbrechen können.
Ciro Santilli新疆改造中心法轮功六四事件
2

Ich hatte den gleichen Fehler nach der Installation von Python 3.5.0 auf meinem Ubuntu 14.04 LTS (das einen Systempython der Version 3.4.0 hat).

Nachdem ich das geöffnet hatte /usr/lib/command-not-found, wurde mir klar, dass dieser Fehler darauf zurückzuführen ist, dass das System dieses Skript mit dem neu installierten Python3.5.0 ausführt, da die Installation von Python3.5.0 das System dazu veranlasst, es beim Eingeben zu verwenden python3.

Dieser Fehler kann leicht korrigiert werden, indem die erste Zeile von geändert wird

#!/usr/bin/python3

zu

#!/usr/bin/python3.4  
user3667217
quelle
Dies ist die beste Antwort imo. In meinem Fall war es eine blöde Entscheidung, python3 mit einer neueren Nebenversion zu verknüpfen. Aber ja, Lektion gelernt.
Guybrush Threepwood
0

Das Problem liegt bei Ihrer $PATHUmgebungsvariablen. Sie haben es höchstwahrscheinlich vermasselt. Es sollte ungefähr so ​​aussehen:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Siehe diesen Linux Mint-Thread: http://forums.linuxmint.com/viewtopic.php?f=18&t=119561 .

Sie können Ihre $PATHin der Shell mit diesem Befehl reparieren :

$ export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Das ist vorübergehend! Wenn das Problem bei einem Neustart weiterhin besteht, haben Sie höchstwahrscheinlich die $PATHSetup-Dateien in einer Ihrer Umgebungen unter abgespritzt /etc.

slm
quelle
0

Das Paket "command-not-found" ist ein Linux-Dienstprogramm. Es reagiert auf unbekannte Befehle an der Eingabeaufforderung der Befehls-Shell, nicht nur innerhalb von Python-Sitzungen. (Ich sehe, dass es auch ein Python-Paket mit diesem Namen gibt.)

Es hat Python unter seinen Abhängigkeiten, dh es verwendet Python, wenn es ausgelöst wird; Dies erklärt, warum Python aufgerufen wird, wenn Sie einen Befehl eingeben, den die Shell in Ihrem PATH nicht findet.

Ich sehe, dass es ein 'apt'-Paket gibt, um einen Befehl zu installieren, der unter Linux nicht gefunden wird. für Debian Linux ist dies katalogisiert unter:

https://packages.debian.org/sid/admin/command-not-found

user312543
quelle
0

Das Auskommentieren aller für command-not-foundin verantwortlichen Zeilen /etc/bash.bashrclöste das Problem, das durch das Wechseln der Python-Versionen entstand.

user64802
quelle