Por que essa mensagem de erro python é gerada sempre que digito um comando sem sentido?

16

Sempre que eu digito qualquer comando "sem sentido", essa mensagem de erro python é gerada. Comandos normais funcionam bem. Alguma idéia de como depurar isso?

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

EDIT - depois de corrigir meu / usr / bin / python, agora recebo esta mensagem de erro diferente do python:

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

De alguma forma, python está sendo executado sempre que eu digitar um comando errado.

ripper234
fonte
11
@ripper: Interessante. Algumas observações perdidas. O seu .bashrc tem algo relacionado ao python? Você tem esse mesmo comportamento com outras contas de usuário? Por que você tem o python 2.7 instalado localmente? Qual é o python oficial padrão nesta instalação e, se não for o 2.7, você o possui? Que versão do ubuntu é essa?
Faheem Mitha 18/03/11
@ Faheem - Não vejo nada de python relacionado no .bashrc. Eu instalei o python localmente. Eu sei que a máquina tem outros dois pítons instalados também. Eu tenho o Ubuntu 10.10 instalado.
ripper234
Isso cheira um pouco como uma instalação python perdida. Quais são as versões pythons oficiais do sistema instaladas e por que você instalou o 2.7 localmente? Não é uma das versões oficialmente disponíveis?
Faheem Mitha 18/03/11
@ Faheem - Eu não entendo sua pergunta. O que você quer dizer com "oficial"? Eu precisava do python 2.7, então o instalei. Eu sou o administrador desta caixa. Eu instalei o python fazendo make / make install, não fiz nada suspeito (eu acho).
ripper234
@ripper: Significado, o ubuntu o forneceu como um pacote binário. Quando você digita python, qual python você obtém?
Faheem Mitha 18/03/11

Respostas:

12

Ok, isso torna as coisas um pouco mais claras. command-not-foundé um programa python, que é executado quando seu comando não é encontrado no sistema. (Sua função é sugerir alternativas e correções em caso de digitação incorreta, etc.) Veja /usr/bin/command-not-found. Ele está tentando importar o CommandNotFoundmódulo e não pode, apontando claramente para uma instalação em python danificada. Não sou tão familiarizado com isso command-not-found, mas acho que corrigir a instalação do Python fará com que o problema desapareça.

Apenas para elaborar um pouco, o que provavelmente está acontecendo é que o command-not-foundmódulo está localizado em algum lugar onde o python padrão não está procurando por ele. Um problema de caminho, basicamente.

Sugestões de depuração:

1) Para começar, qual é a saída de

$ which python

e a que pacote / instalação esse arquivo pertence?

2) Qual é a saída da sua instalação correspondente ao código abaixo? O caminho aqui é o caminho de importação desse python.

$ 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
fonte
11
Uma possível solução é # apt-get remove command-not-found...
simon
"Instalação ferrada de python" - qualquer idéia do que exatamente está faltando. O CommandNotFound é um módulo python básico ou posso / devo instalá-lo separadamente?
ripper234
@ripper: CommandNotFound faz parte do comando não encontrado pacote, que deve ser instalado em sua máquina já, senão você não estaria vendo esta mensagem. No entanto, você pode facilmente verificar isso consultando o gerenciador de pacotes. Comando dpkg -l não encontrado. Seu problema é que sua instalação python padrão não está vendo este módulo. Vou adicionar algumas etapas para depurar acima. Outros, por favor, sinta-se livre para modificar e corrigir.
Faheem Mitha 19/03/11
Veja esta pergunta de acompanhamento - unix.stackexchange.com/questions/9711/…
ripper234:
os links para command-not-foundparecer quebrado (embora seja difícil dizer se "erro" é o resultado esperado quando procurar "-not-found comando" ...)
Nikana Reklawyks
2

Eu me deparei com isso quando atualizei do estoque 2.6 que veio com a minha instalação do ubuntu para o python 3.2, definindo a alternativa padrão como 3.2 em vez de 2.6.

Se você olhar para o seu /etc/bash.bashrcarquivo, há uma linha que diz para executar esse script python e procurar alternativas nos repositórios. Existe um pacote para ele, no entanto, você não pode removê-lo após a atualização. Eu simplesmente mudou o /usr/share/command-not-founde /usr/lib/command_not_found_handlere reiniciado o meu mandato e funciona como bom ol bash': command not found.

RoboticGolem
fonte
6
Se você deseja desativar o command_not_foundmanipulador, não mexa /usr(isso pode fazer com que as atualizações subseqüentes falhem ou sejam desfeitas pelas atualizações subseqüentes). Em vez disso, mude /etc/bash.bashrc. Ou desative isso sozinho ~/.bashrccom unset -f command_not_found_handle.
Gilles 'SO- stop be evil'
Em particular, /etc/bash.bashrcé fornecido pelo bashpacote, para que você possa interromper as atualizações desse pacote.
Ciro Santilli escreveu:
2

Eu tive esse mesmo erro depois de instalar o Python 3.5.0 no meu Ubuntu 14.04 LTS (que possui um python do sistema da versão 3.4.0).

Depois de abrir o /usr/lib/command-not-foundarquivo, percebi que esse erro se deve ao sistema executando este script usando o python3.5.0 recém-instalado, porque a instalação do Python3.5.0 cria leva o sistema a usá-lo quando você digita python3.

Este erro pode ser facilmente corrigido alterando a primeira linha de

#!/usr/bin/python3

para

#!/usr/bin/python3.4  
user3667217
fonte
Esta é a melhor resposta imo. No meu caso, foi uma decisão estúpida em vincular o python3 a uma versão menor mais nova, pensando que a compatibilidade não deveria ser interrompida. Mas sim, lição aprendida.
Guybrush Threepwood
0

O problema está na sua $PATHvariável de ambiente. Você provavelmente estragou tudo. Deve ser semelhante a este:

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

Consulte este tópico do Linux Mint: http://forums.linuxmint.com/viewtopic.php?f=18&t=119561 .

Você pode reparar o seu $PATHno shell com este comando:

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

Isto é temporário! Se o problema persistir com uma reinicialização, é provável que você tenha hospedado o $PATHarquivo em um dos arquivos de configuração do ambiente em /etc.

slm
fonte
0

O pacote "command-not-found" é um utilitário linux; ele responde a comandos desconhecidos no prompt do shell de comandos, não apenas nas sessões python. (Vejo que também há um pacote python com esse nome.)

Possui python entre suas dependências, ou seja, usa python quando acionado; de modo que explique por que o python é chamado sempre que você digita um comando que o shell não pode encontrar no seu PATH.

Vejo que há um pacote 'apt' para instalar o comando não encontrado no Linux; para o Debian linux, isso está catalogado em:

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

user312543
fonte
0

Comentando todas as linhas responsável command-not-foundem /etc/bash.bashrcresolver o problema, que foi criado por comutação versões Python.

user64802
fonte