Come posso correggere gli errori PyDev "Variabile non definita dall'importazione"?


138

Ho un progetto Python usando PyDev in Eclipse e PyDev continua a generare falsi errori per il mio codice. Ho un modulo settingsche definisce un settingsoggetto. Importa quello nel modulo be assegno un attributo con:

from settings import settings
settings.main = object()

In alcuni dei miei codici - ma non in tutto, affermazioni come:

from settings import settings
print settings.main 

... genera messaggi "Variabile non definita dall'importazione: principale" nel riquadro degli errori del codice Eclipse, anche se il codice viene eseguito senza problemi. Come posso correggerli?


Non ho visto nulla di correlato al pilastro in queste risposte: \ Penso che sia da lì che proviene questo avviso e speravo di trovare come dire al pilastro che questa non è una variabile, è un'importazione.
ThorSummoner,

Risposte:


156

Per il codice nel tuo progetto, l'unico modo è aggiungere una dichiarazione in cui si afferma che te lo aspetti, possibilmente protetto da un if Falsemodo che non venga eseguito (l'analisi statica del codice vede solo ciò che vedi, non le informazioni di runtime) se aperto quel modulo tu stesso, non avresti alcuna indicazione che il main fosse previsto).

Per ovviare a questo ci sono alcune scelte:

  1. Se è un modulo esterno, è possibile aggiungerlo in forced builtinsmodo che PyDev generi una shell per ottenere informazioni di runtime (vedere http://pydev.org/manual_101_interpreter.html per i dettagli) - vale a dire: principalmente, PyDev importare il modulo in una shell e fare un dir(module)e dirsulle classi trovate nel modulo per presentare i completamenti e fare l'analisi del codice.

  2. Puoi usare Ctrl + 1 (Cmd + 1 per Mac) in una riga con un errore e PyDev ti presenterà un'opzione per aggiungere un commento per ignorare quell'errore.

  3. È possibile creare un stubmodulo e aggiungerlo ai predefinedcompletamenti ( http://pydev.org/manual_101_interpreter.html contiene anche dettagli su questo).


1
a volte l'aggiunta di un modulo ai builtin forzati non aiuta (vedi questo bug, ad esempio sourceforge.net/tracker/… )
Boris Gorelik

@Fabio: che dire dei completamenti predefiniti potrebbero essere usati qui? E quali opzioni ci sono se fai qualcosa come try: import a; except: a=mockModuleesiste un modo per sopprimere questi senza i commenti?
Ted

8
Ho provato Ctrl-1 che mi dà '@UndefinedVariable' che aggiunge un'anotazione e che funziona. Grazie.
RichMeister

Sto riscontrando lo stesso problema con gli ultimi Eclipse e PyDev. Posso navigare tra tutti i moduli, quindi perché l'analisi del codice non può fare lo stesso?
Adam,

3
Prima di andare agli estremi, assicurati che la directory sia in PYTHONPATH, quindi esci / riavvia Eclipse, fai Progetto> Pydev> Rimuovi marcatori di errore e ora numpy dovrebbe apparire nei built-in Forced.
smci,

49

Sto usando opencv che si basa su binari ecc. Quindi ho degli script in cui ogni altra riga ha questo errore sciocco. Python è un linguaggio dinamico, quindi tali occasioni non devono essere considerate errori.

Ho rimosso del tutto questi errori andando a:

Finestra -> Preferenze -> PyDev -> Editor -> Analisi codice -> Non definito -> Variabile non definita dall'importazione -> Ignora

E quello è quello.

Potrebbe anche essere, Finestra -> Preferenze -> PyDev -> Editor -> Analisi del codice -> Importazioni -> Importazione non trovata -> Ignora


8
Grazie per questo. È semplice e facile. Tuttavia, invece di modificare l'impostazione "Importa non trovato" su "Ignora", l'ho modificato in "Avviso". ORA NULLA MOSTRA NIENTE. :) Spero di ricevere un avviso se ho un problema di importazione REALE.
Amore e pace - Joe Codeswell,

1
Ho dovuto riavviare Eclipse per rendere effettive le modifiche.
spettekaka,

21

Il post contrassegnato come risposta fornisce una soluzione alternativa, non una soluzione.

Questa soluzione funziona per me:

  • Vai a Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Vai alla Forced builtinsscheda
  • Clicca su New...
  • Digita il nome del modulo ( multiprocessingnel mio caso) e fai clicOK

Non solo i messaggi di errore scompariranno, ma verranno riconosciuti anche i membri del modulo.


1
Considerando che il "post contrassegnato come risposta" è stato scritto dallo sviluppatore di PyDev, dovresti forse dare un'altra occhiata a questo. Non fornisce istruzioni esplicite nel post stesso perché si collega alle istruzioni che hai specificato.
coredumperror,

5
@CoreDumpError Non mi interessa chi ha scritto un post. Ho provato ciò che il post descrive e funziona, ma è una soluzione alternativa, non una soluzione. Quello che descrivo potrebbe non funzionare per altri computer, ma funziona per me ed è la soluzione corretta. Se l'altro post si collega alla soluzione invece di descriverla, quindi non segue le linee guida, ho seguito le linee guida descrivendo quale è una buona soluzione per me, sperando che possa aiutare gli altri.
stenci,

2
@Isaac Ora sì, ho pubblicato la mia risposta prima che fosse modificata.
stenci,

Sì, questa è una soluzione molto migliore e più pulita! Invece di mascherare o nascondere offre la soluzione legittima. Ho dovuto aggiungere, rema una volta non ho più inchiostro rosso per cose comere.M
Bostone,

10

Avevo un problema simile con un progetto Eclipse / PyDev. In questo progetto la directory principale del codice Python era una sottodirectory del progetto.

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

Quando è stato eseguito il debug o l'esecuzione del progetto, tutto è andato bene, poiché la directory di lavoro è stata impostata nella posizione corretta. Tuttavia, l'analisi del codice PyDev non è riuscita a trovare alcuna importazione da module1 o module2.

La soluzione era quella di modificare le proprietà del progetto -> PyDev - sezione PYTHONPATH e rimuovere / MyProject dalla scheda delle cartelle di origine e aggiungere invece / MyProject / src.


Volevo solo verificare che in effetti funzionasse perfettamente.
Amndeep7,

Sì, è semplicemente andato al menu principale Progetto / Proprietà / PyDev - PYTHONPATH e ha aggiunto tutti i percorsi necessari per l'app, che ha risolto il problema!
Kostyantyn,

6

Questo ha funzionato per me:

passaggio 1) Rimozione dell'interprete, configurazione automatica di nuovo

passaggio 2) Finestra - Preferenze - PyDev - Interpreti - Interprete Python Vai alla scheda Costruiti forzati Fai clic su Nuovo ... Digita il nome del modulo (maledizioni nel mio caso) e fai clic su OK

passaggio 3) Fare clic con il pulsante destro del mouse in Esplora progetti sul modulo che genera errori. Vai a PyDev-> Analisi del codice.


ha funzionato anche per me, grazie per aver reso ogni passaggio più esplicito rispetto alla risposta attualmente accettata.
sc28,

1

Ho avuto lo stesso problema. Sto usando Python ed Eclipse su Windows. Il codice funzionava bene, ma eclipse mostra errori ovunque. Dopo aver modificato il nome della cartella "Lib" in "lib" (C: \ Python27 \ lib), il problema è stato risolto. Sembra che se la maiuscola delle lettere non corrisponde a quella nel file di configurazione, questo a volte causerà problemi (ma sembra non sempre, perché il controllo degli errori è andato bene per molto tempo prima che i problemi apparissero all'improvviso per nessun ovvio Motivo).


4
Questo è il passatempo preferito di Eclipse. Fare improvvisamente apparire bandiere di errore senza motivo. Fa impazzire la gente pensando di aver rotto IL MONDO, tranne per il fatto che c'è qualche insensata bandiera di errore che Eclipse ha improvvisamente deciso di implementare in modo casuale per divertimento e profitto (?)
R Thiede

Ho provato questo, e ho pensato che avesse funzionato, ma era solo uno stratagemma , ma ci sono voluti> 5 minuti, quindi non posso annullare. Tuttavia @ Fabio Zadrozny ctrl-1 @UndefinedVariable ha funzionato perfettamente e continua a funzionare anche dopo 5 minuti!
Mark Mikofski

1

Un'approssimazione di ciò che stavo facendo:

import module.submodule

class MyClass:
    constant = submodule.constant

A quale pilastro diceva: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Ho risolto questo cambiando la mia importazione come:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Nota: ho anche rinominato dalla variabile importata per avere un nome in maiuscolo per riflettere la sua natura costante.


0

È possibile che sia sufficiente riconfigurare il percorso Python in Eclipse. Vedi la mia risposta a una domanda simile.


0

nelle preferenze -> PyDev -> PyLint negli argomenti da passare a PyLint aggiungi questa riga:

--generated-members=objects

dovrai farlo per ogni generato. L'ho trovato su Google, ma ho perso il riferimento.


0

Fare clic con il tasto destro del mouse in Esplora progetti sul modulo che genera errori. Vai a PyDev-> Rimuovi marcatori di errore.


0

La mia risposta non contribuisce a nulla di nuovo, solo un esempio concreto che ho incontrato.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev ha mostrato il messaggio di errore "Variabile non definita dall'importazione: get_default_root_window ()"

Nella shell di Python puoi vedere che questo è un modulo 'incorporato' come menzionato in una risposta sopra:

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

Ora in Finestra-> Preferenze-> PyDev-> Interpreti-> Interprete Python, ho selezionato la scheda 'Costretti forzati' e ho aggiunto 'gtk.gdk' all'elenco.

Ora il messaggio di errore non viene più visualizzato.


0

Trovo che questi 2 passaggi funzionino sempre per me:

  1. Conferma (altrimenti aggiungi) la cartella principale del modulo su PYTHONPATH.
  2. Aggiungi il nome FULL del modulo ai builtin forzati.

Le cose da notare qui:

  • Alcuni moduli popolari si installano con alcune coppie padre e figlio con lo stesso nome. In questi casi devi anche aggiungere quel genitore a PYTHONPATH, oltre alla sua cartella dei nonni, che hai già confermato / aggiunto per tutto il resto.

  • Utilizzare (ad esempio) "google.appengine.api.memcache" quando si aggiungono i builtin forzati, NON solo "memcache", dove "google" in questo esempio è figlio immediato di una cartella definita in PYTHONPATH.


Come posso aggiungere lib.site-pacchetti._pytest ai builtin forzati ... non accetta il simbolo "-" ... Sto riscontrando un problema di importazione con il modulo di configurazione e sto provando a fare il tuo rimedio, per favore aiutatemi
zelo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.