Почему это сообщение об ошибке Python генерируется всякий раз, когда я набираю бессмысленную команду?

16

Всякий раз, когда я набираю какую-либо «бессмысленную» команду, генерируется это сообщение об ошибке Python. Обычные команды работают нормально. Есть идеи, как это отладить?

$ 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
$

РЕДАКТИРОВАТЬ - после исправления моего / usr / bin / python, я теперь получаю это другое сообщение об ошибке Python:

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

Каким-то образом python запускается всякий раз, когда я набираю команду неправильно.

ripper234
источник
1
@ripper: Интересно. Несколько случайных наблюдений. Есть ли в вашем .bashrc что-нибудь связанное с питоном? Вы получаете такое же поведение с другими учетными записями пользователей? Почему у вас установлен Python 2.7 локально? Какой официальный python по умолчанию в этой установке, и если нет 2.7, у вас установлен? Что это за версия Ubuntu?
Фахим Митха
@Faheem - я не вижу ничего похожего на python в .bashrc. Я сам установил python локально. Я знаю, что на машине установлены два других питона. У меня установлена ​​Ubuntu 10.10.
ripper234
Это пахнет немного как установка на питоне, сбившаяся с пути. Какие версии официальных системных питонов установлены, и почему вы установили 2.7 локально? Разве это не одна из официально доступных версий?
Фахим Митха
@ Фахим - я не понимаю твой вопрос. Что вы подразумеваете под "официальным"? Мне нужен был Python 2.7, поэтому я установил его. Я администратор этой коробки. Я установил python, выполнив make / make install, но ничего подозрительного не сделал.
ripper234
@ripper: То есть, Ubuntu предоставил его в виде двоичного пакета. Когда вы набираете python, какой Python вы получаете?
Фахим Мита

Ответы:

12

Хорошо, это проясняет ситуацию. command-not-foundэто программа на питоне, которая запускается, когда ваша команда не найдена в системе (Его функция - предлагать альтернативы и исправления в случае опечатки и т. Д.). См /usr/bin/command-not-found. Он пытается импортировать CommandNotFoundмодуль и не может, явно указывая на испорченную установку python. Я не очень знаком с этим command-not-found, но я думаю, что исправление вашей установки Python решит проблему.

Просто, чтобы уточнить, вероятно, происходит то, что command-not-foundмодуль находится где-то там, где ваш Python по умолчанию его не ищет. Проблема пути, в основном.

Предложения отладки:

1) Для начала, каков выход

$ which python

и к какому пакету / установке принадлежит этот файл?

2) Какой вывод для вашей установки соответствует приведенному ниже коду? Путь здесь - путь импорта этого питона.

$ 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']
Фахим Митха
источник
1
одно из возможных решений # apt-get remove command-not-found...
Симон
«Привернутая установка python» - любая идея, чего именно не хватает. Является ли CommandNotFound основным модулем Python или можно / нужно установить его отдельно?
ripper234
@ripper: CommandNotFound является частью пакета command-not-found , который уже должен быть установлен на вашем компьютере, иначе вы не увидите это сообщение. Однако вы можете легко это проверить, обратившись к менеджеру пакетов. Команда dpkg -l-not-found. Ваша проблема в том, что ваша установка Python по умолчанию не видит этот модуль. Я добавлю несколько шагов для отладки выше. Другие, пожалуйста, не стесняйтесь изменять и исправлять.
Фахим Митха
См. Этот дополнительный вопрос - unix.stackexchange.com/questions/9711/…
ripper234
ссылки command-not-foundкажутся неработающими (хотя трудно сказать, является ли «ошибка» ожидаемым результатом при поиске «команда не найдена» ...)
Никана Рекламикс
2

Я столкнулся с этим, когда обновил версию 2.6, поставляемую с моей установкой Ubuntu, до версии python 3.2, установив альтернативу по умолчанию 3.2, а не 2.6.

Если вы посмотрите на свой /etc/bash.bashrcфайл, есть строка, которая говорит ему запустить этот скрипт на python для поиска альтернатив в репозиториях. Существует пакет для него, однако вы не можете удалить пакет после обновления. Я просто переехал /usr/share/command-not-foundи /usr/lib/command_not_found_handlerи перезапустить свой срок , и он работает как хороший Ol»Баш: command not found.

RoboticGolem
источник
6
Если вы хотите отключить command_not_foundобработчик, не связывайтесь с ним /usr(это может привести к сбою последующих обновлений или отмене последующих обновлений). Вместо этого измени /etc/bash.bashrc. Или отключить это самостоятельно ~/.bashrcс unset -f command_not_found_handle.
Жиль "ТАК - перестань быть злым"
В частности, /etc/bash.bashrcпредоставляется bashпакетом, чтобы вы могли нарушать обновления этого пакета.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
2

У меня была такая же ошибка после установки Python 3.5.0 на мою Ubuntu 14.04 LTS (у которой есть системный питон версии 3.4.0).

После того, как я открыл /usr/lib/command-not-found, я понял, что эта ошибка происходит из-за того, что система выполняет этот скрипт с использованием недавно установленного python3.5.0, потому что установка Python3.5.0 создает, заставляет систему использовать его при вводе python3.

Эту ошибку можно легко исправить, изменив первую строку с

#!/usr/bin/python3

в

#!/usr/bin/python3.4  
user3667217
источник
Это лучший ответ ИМО. В моем случае это было глупое решение использовать symlink python3 для более новой минорной версии, думая, что совместимость не должна нарушаться. Но да, урок усвоен.
Гайбраш Трипвуд
0

Проблема связана с вашей $PATHпеременной среды. Скорее всего, вы все испортили. Это должно быть похоже на это:

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

См. Эту ветку Linux Mint: http://forums.linuxmint.com/viewtopic.php?f=18&t=119561 .

Вы можете восстановить ваш $PATHв оболочке с помощью этой команды:

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

Это временно! Если проблема не устраняется после перезагрузки, скорее всего, вы использовали$PATH в одном из ваших файлов установки среды /etc.

SLM
источник
0

Пакет "команда не найдена" - это утилита linux; он отвечает на неизвестные команды в командной строке, а не только в сеансах Python. (Я вижу, что есть также пакет Python с этим именем.)

Он имеет Python среди своих зависимостей, то есть он использует Python при запуске; Это объясняет, почему Python вызывается всякий раз, когда вы вводите команду, которую оболочка не может найти в вашем PATH.

Я вижу, что есть пакет 'apt' для установки команды not-found в Linux; для Debian Linux это каталогизировано по адресу:

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

user312543
источник
0

Комментируя все строки ответственности за command-not-foundв /etc/bash.bashrcрешить проблему, которая была создана путем переключения версий Python.

user64802
источник