Como corrijo os erros de "Variável indefinida da importação" do PyDev?


138

Eu tenho um projeto Python usando PyDev no Eclipse, e o PyDev continua gerando erros falsos no meu código. Eu tenho um módulo settingsque define um settingsobjeto. Eu importo isso no módulo be atribuo um atributo com:

from settings import settings
settings.main = object()

Em alguns dos meus códigos - mas não em todos, declarações como:

from settings import settings
print settings.main 

... gera mensagens "Variável indefinida de import: main" no painel de erros do código Eclipse, mesmo que o código seja executado sem problemas. Como posso corrigir isso?


Não vi nada relacionado ao pylint nestas respostas: \ Acho que é de onde esse aviso se origina e eu esperava descobrir como dizer ao pylint que isso não é variável, é uma importação.
ThorSummoner

Respostas:


156

Para o código em seu projeto, a única maneira é adicionar uma declaração dizendo que você esperava que - possivelmente protegido por um if Falsepara que não seja executado (a análise de código estática vê apenas o que você vê, não as informações de tempo de execução - se você você mesmo abriu o módulo, você não teria nenhuma indicação de que o principal era esperado).

Para superar isso, existem algumas opções:

  1. Se for algum módulo externo, é possível adicioná-lo ao forced builtinsPyDev para gerar um shell para obter informações de tempo de execução (consulte http://pydev.org/manual_101_interpreter.html para obter detalhes) - ou seja: principalmente, o PyDev irá importar o módulo em uma concha e fazer um dir(module)e dirsobre as classes encontradas no módulo de completação presentes e análise de código make.

  2. Você pode usar Ctrl + 1 (Cmd + 1 para Mac) em uma linha com um erro e o PyDev apresentará uma opção para adicionar um comentário para ignorar esse erro.

  3. É possível criar um stubmódulo e adicioná-lo às predefinedconclusões ( http://pydev.org/manual_101_interpreter.html também possui detalhes sobre isso).


1
por vezes, a adição de um módulo para builtins forçados não ajuda (ver este bug, por exemplo sourceforge.net/tracker/... )
Boris Gorelik

@ Fabio: E quanto às conclusões predefinidas, elas poderiam ser usadas aqui? E que opções existem se você fizer algo como try: import a; except: a=mockModule: existe alguma maneira de suprimi-las sem os comentários?
ted

8
Eu tentei Ctrl-1 que me dá '@UndefinedVariable', que adiciona uma anotação e funciona. Obrigado.
RichMeister

Estou enfrentando o mesmo problema com os mais recentes Eclipse e PyDev. Posso navegar entre todos os módulos. Por que a análise de código não pode fazer o mesmo?
Adam

3
Antes de ir ao extremo, verifique se o diretório está em PYTHONPATH, saia / reinicie o Eclipse, faça Projeto> Pydev> Remover marcadores de erro , e numpy agora deve aparecer nos componentes internos Forçados.
SMCI

49

Estou usando o opencv, que depende de binários, etc, então eu tenho scripts onde todas as outras linhas têm esse erro bobo. Python é uma linguagem dinâmica, portanto, essas ocasiões não devem ser consideradas erros.

Eu removi esses erros completamente indo para:

Janela -> Preferências -> PyDev -> Editor -> Análise de Código -> Indefinido -> Variável Indefinida de Importação -> Ignorar

E é isso.

Também pode ser, Janela -> Preferências -> PyDev -> Editor -> Análise de Código -> Importações -> Importação não encontrada -> Ignorar


8
Obrigado por isso. É simples e fácil. No entanto, em vez de alterar a configuração "Importar não encontrado" para "Ignorar", alterei para "Aviso". Agora nada aparece. :) Espero que receba um aviso se tiver um problema de importação REAL.
Amor e paz - Joe Codeswell

1
Teve que reiniciar o Eclipse para que as alterações entrassem em vigor.
spettekaka 12/09

21

A postagem marcada como resposta fornece uma solução alternativa, não uma solução.

Esta solução funciona para mim:

  • Vamos para Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Vá para a Forced builtinsguia
  • Clique em New...
  • Digite o nome do módulo ( multiprocessingno meu caso) e clique emOK

Não apenas as mensagens de erro desaparecem, os membros do módulo também serão reconhecidos.


1
Considerando que a "postagem marcada como resposta" foi escrita pelo desenvolvedor do PyDev, talvez você deva dar uma outra olhada nela. Ele não fornece instruções explícitas no próprio post porque vincula as instruções que você especificou.
Coredumperror

5
@CoreDumpError Não me importo com quem escreveu um post. Eu tentei o que o post descreve e funciona, mas é uma solução alternativa, não uma solução. O que eu descrevo pode não funcionar em outros computadores, mas funciona para mim e é a solução correta. Se o outro post vincular à solução em vez de descrevê-la, ele não seguirá as diretrizes, eu as segui descrevendo o que é uma boa solução para mim, esperando que ajude outras pessoas.
stenci

2
@ Isaac Agora, publiquei minha resposta antes de ser editada.
stenci

Sim, esta é uma solução muito melhor e mais limpa! Em vez de mascarar ou ocultar, oferece a correção legítima. Eu tive que adicionar, remas uma vez que não fiz mais tinta vermelha para coisas comore.M
Bostone 17/06/19

10

Eu estava tendo um problema semelhante com um projeto Eclipse / PyDev. Neste projeto, o diretório raiz do código python era um subdiretório do projeto.

--> MyProject
 + --> src         Root of python code
   + --> module1     A module 
   + --> module2     Another module
 + --> docs
 + --> test

Quando o projeto foi depurado ou executado, tudo estava bem, pois o diretório de trabalho foi definido no local correto. No entanto, a análise de código do PyDev falhou ao encontrar importações do módulo1 ou do módulo2.

A solução foi editar as propriedades do projeto -> PyDev - PYTHONPATH e remover / MyProject da guia de pastas de origem e adicionar / MyProject / src a ele.


Só queria fornecer a verificação de que isso realmente funciona perfeitamente.
precisa saber é o seguinte

Sim, basta ir ao menu principal Projeto / Propriedades / PyDev - PYTHONPATH e adicionar todos os caminhos necessários para o aplicativo, que resolveu o problema!
22913 Kostyantyn

6

Isso funcionou para mim:

passo 1) Removendo o intérprete, configurando-o automaticamente novamente

Etapa 2) Janela - Preferências - PyDev - Intérpretes - Intérprete Python Vá para a guia Forças internas clique em Novo ... Digite o nome do módulo (maldições no meu caso) e clique em OK

Etapa 3) Clique com o botão direito do mouse no explorador de projetos, no módulo que estiver apresentando erros. Vá para PyDev-> Code analysis.


também funcionou para mim, obrigado por tornar cada etapa mais explícita do que na resposta atualmente aceita.
SC28

1

Eu tive o mesmo problema. Estou usando Python e Eclipse no Windows. O código estava funcionando muito bem, mas o eclipse mostra erros em todos os lugares. Depois de alterar o nome da pasta 'Lib' para 'lib' (C: \ Python27 \ lib), o problema foi resolvido. Parece que, se a capitalização das letras não coincidir com a do arquivo de configuração, isso às vezes causará problemas (mas parece que nem sempre, porque a verificação de erros ficou boa por muito tempo antes que os problemas parecessem repentinamente sem óbvio razão).


4
Este é o passatempo favorito do Eclipse. Fazer sinalizadores de erro aparecer repentinamente sem motivo. Ele leva as pessoas pensamento louco de que eles romperam do mundo, exceto que é algum indicador de erro absurdo que Eclipse, de repente, decidiu implementar aleatoriamente por diversão e lucro (?)
R Thiede

Eu tentei isso e pensei que tinha funcionado, mas era apenas um ardil , mas demorou> 5min, então não posso desfazer. No entanto, Fabio Zadrozny ctrl-1 @UndefinedVariable funcionou perfeitamente e continua a funcionar mesmo após 5 minutos!
Mark Mikofski

1

Uma aproximação do que eu estava fazendo:

import module.submodule

class MyClass:
    constant = submodule.constant

Para qual pylint disse: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Resolvi isso alterando minha importação como:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Nota: Também renomei pela variável importada para ter um nome em maiúscula para refletir sua natureza constante.


0

É possível que você apenas precise reconfigurar seu caminho python no Eclipse. Veja minha resposta para uma pergunta semelhante.


0

nas preferências -> PyDev -> PyLint sob argumentos a serem passados ​​para o PyLint, adicione esta linha:

--generated-members=objects

você precisará fazer isso para cada gerado. Encontrei isso pesquisando no Google, mas perdi a referência.


0

Clique com o botão direito do mouse no explorador de projetos, no módulo que estiver apresentando erros. Vá para PyDev-> Remover marcadores de erro.


0

Minha resposta não contribui com nada de novo, apenas um exemplo concreto que encontrei.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev mostrou a mensagem de erro "Variável indefinida da importação: get_default_root_window ()"

No shell python, você pode ver que este é um módulo 'interno', conforme mencionado na resposta acima:

>>> import gtk.gdk
>>> gtk.gdk
<module 'gtk.gdk' (built-in)>

Agora, em Janela-> Preferências-> PyDev-> Intérpretes-> Python Interpreter, selecionei a guia 'Forced Builtins' e adicionei 'gtk.gdk' à lista.

Agora a mensagem de erro não era mais exibida.


0

Acho que essas duas etapas funcionam para mim o tempo todo:

  1. Confirme (adicione mais) a pasta pai do módulo no PYTHONPATH.
  2. Adicione o nome CHEIO do módulo aos componentes internos forçados.

As coisas a serem observadas aqui:

  • Alguns módulos populares são instalados com algum par pai e filho com o mesmo nome. Nesses casos, você também deve adicionar esse pai ao PYTHONPATH, além da pasta dos avós, que você já confirmou / adicionou para todo o resto.

  • Use (por exemplo) "google.appengine.api.memcache" ao adicionar aos buildins forçados, NÃO apenas "memcache", onde "google" neste exemplo é filho imediato de uma pasta definida em PYTHONPATH.


Como posso adicionar lib.site-packages._pytest a buildins forçados ... não está aceitando o símbolo '-' ... Estou tendo problemas de importação com o módulo de configuração e tentando fazer seu remédio, por favor ajude
zeal

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.