Wie behebe ich PyDev-Fehler "Undefinierte Variable aus Import"?

138

Ich habe ein Python-Projekt, das PyDev in Eclipse verwendet, und PyDev generiert immer wieder falsche Fehler für meinen Code. Ich habe ein Modul settings, das ein settingsObjekt definiert . Ich importiere das in Modul bund weise ein Attribut zu mit:

from settings import settings
settings.main = object()

In einigen meiner Codes - aber nicht in allen - Aussagen wie:

from settings import settings
print settings.main 

... im Eclipse-Code-Fehlerbereich "Undefinierte Variable aus Import: Main" -Nachrichten generieren, obwohl der Code problemlos ausgeführt wird. Wie kann ich diese korrigieren?

Chris B.
quelle
Ich habe in diesen Antworten nichts im Zusammenhang mit Pylint gesehen: \ Ich glaube, dass dieser Hinweis von dort stammt, und ich hatte gehofft herauszufinden, wie ich Pylint sagen kann, dass dies keine Variable ist, sondern ein Import.
ThorSummoner

Antworten:

156

Für Code in Ihrem Projekt besteht die einzige Möglichkeit darin, eine Deklaration hinzuzufügen, die besagt, dass Sie dies erwartet haben - möglicherweise geschützt durch eine, if Falsedamit es nicht ausgeführt wird (die statische Code-Analyse sieht nur das, was Sie sehen, keine Laufzeitinformationen -, wenn Sie dies tun Wenn Sie dieses Modul selbst geöffnet haben, haben Sie keinen Hinweis darauf, dass main erwartet wurde.

Um dies zu überwinden, gibt es einige Möglichkeiten:

  1. Wenn es sich um ein externes Modul handelt, können Sie es dem Modul hinzufügen, forced builtinssodass PyDev eine Shell erstellt, um Laufzeitinformationen abzurufen ( Details finden Sie unter http://pydev.org/manual_101_interpreter.html ) Importieren Sie das Modul in eine Shell und führen Sie ein dir(module)und dirfür die im Modul gefundenen Klassen aus, um Vervollständigungen darzustellen und eine Code-Analyse durchzuführen.

  2. Sie können Strg + 1 (Cmd + 1 für Mac) in einer fehlerhaften Zeile verwenden. PyDev bietet Ihnen die Möglichkeit, einen Kommentar hinzuzufügen, um diesen Fehler zu ignorieren.

  3. Es ist möglich, ein stubModul zu erstellen und zu den predefinedVervollständigungen hinzuzufügen ( http://pydev.org/manual_101_interpreter.html enthält auch Details dazu).

Fabio Zadrozny
quelle
1
Manchmal hilft es nicht, ein Modul zu erzwungenen Buildins hinzuzufügen (siehe diesen Fehler, zum Beispiel sourceforge.net/tracker/… )
Boris Gorelik
@Fabio: Was ist mit vordefinierten Abschlüssen? , die hier verwendet werden könnten? Und welche Möglichkeiten gibt es, wenn Sie so etwas tun. Gibt try: import a; except: a=mockModulees eine Möglichkeit , diese ohne die Kommentare zu unterdrücken?
22.
8
Ich habe Strg-1 ausprobiert, es gibt mir '@UndefinedVariable', das eine Anotation hinzufügt und das funktioniert. Vielen Dank.
RichMeister
Ich habe das gleiche Problem mit den neuesten Eclipse und PyDev. Ich kann zwischen allen Modulen navigieren. Warum kann die Code-Analyse nicht dasselbe tun?
Adam
3
Bevor Sie zu Extremen gehen, stellen Sie sicher, dass sich das Verzeichnis in PYTHONPATH befindet, beenden Sie Eclipse, starten Sie Project> Pydev> Fehlermarkierungen entfernen , und numpy sollte jetzt in den Forced-Buildins angezeigt werden.
smci
49

Ich verwende opencv, das auf Binärdateien usw. basiert, also habe ich Skripte, in denen jede andere Zeile diesen dummen Fehler aufweist. Python ist eine dynamische Sprache, daher sollten solche Anlässe nicht als Fehler angesehen werden.

Ich habe diese Fehler vollständig behoben, indem ich zu:

Fenster -> Einstellungen -> PyDev -> Editor -> Codeanalyse -> Undefiniert -> Undefinierte Variable aus Import -> Ignorieren

Und das ist das.

Es kann auch sein, Fenster -> Einstellungen -> PyDev -> Editor -> Code-Analyse -> Importe -> Import nicht gefunden -> Ignorieren

ubershmekel
quelle
8
Danke dafür. Es ist einfach und leicht. Anstatt die Einstellung "Import nicht gefunden" in "Ignorieren" zu ändern, habe ich sie in "Warnung" geändert. JETZT ZEIGT NICHTS. :) Hoffentlich bekomme ich eine Warnung, wenn ich ein echtes Importproblem habe.
Liebe und Frieden - Joe Codeswell
1
Musste Eclipse neu starten, damit die Änderungen wirksam werden.
Spettekaka
21

Der als Antwort gekennzeichnete Beitrag bietet eine Problemumgehung und keine Lösung.

Diese Lösung funktioniert bei mir:

  • Gehe zu Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Gehe zum Forced builtins Registerkarte
  • Klicke auf New...
  • Geben Sie den Namen des Moduls ein ( multiprocessingin meinem Fall) und klicken Sie aufOK

Die Fehlermeldungen verschwinden nicht nur, die Modulmitglieder werden auch erkannt.

stenci
quelle
1
In Anbetracht dessen, dass der als Antwort gekennzeichnete "Beitrag" vom Entwickler von PyDev geschrieben wurde, sollten Sie ihn sich vielleicht noch einmal ansehen. Er gibt im Beitrag selbst keine expliziten Anweisungen, da er auf die von Ihnen angegebenen Anweisungen verweist.
Coredumperror
5
@CoreDumpError Es ist mir egal, wer einen Beitrag geschrieben hat. Ich habe versucht, was der Beitrag beschreibt, und es funktioniert, ist aber eine Problemumgehung, keine Lösung. Was ich beschreibe, funktioniert möglicherweise nicht für andere Computer, funktioniert aber für mich und ist die richtige Lösung. Wenn der andere Beitrag auf die Lösung verweist, anstatt sie zu beschreiben, folgt er nicht den Richtlinien. Ich habe die Richtlinien befolgt und beschrieben, was für mich eine gute Lösung ist, in der Hoffnung, dass dies anderen hilft.
Stenci
2
@Isaac Jetzt habe ich meine Antwort gepostet, bevor sie bearbeitet wurde.
Stenci
Ja, das ist eine viel bessere und sauberere Lösung! Anstatt zu maskieren oder zu verstecken, bietet es die legitime Lösung. Ich musste hinzufügen, reaber einmal habe ich keine rote Tinte mehr für Dinge wiere.M
Bostone
10

Ich hatte ein ähnliches Problem mit einem Eclipse / PyDev-Projekt. In diesem Projekt war das Stammverzeichnis des Python-Codes ein Unterverzeichnis des Projekts.

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

Beim Debuggen oder Ausführen des Projekts war alles in Ordnung, da das Arbeitsverzeichnis auf den richtigen Ort eingestellt war. Bei der PyDev-Code-Analyse konnten jedoch keine Importe von Modul1 oder Modul2 gefunden werden.

Die Lösung bestand darin, die Projekteigenschaften -> PyDev - PYTHONPATH zu bearbeiten und / MyProject von der Registerkarte Quellordner zu entfernen und stattdessen / MyProject / src hinzuzufügen.

Jules
quelle
Ich wollte nur überprüfen, ob dies tatsächlich perfekt funktioniert.
Amndeep7
Ja, ging einfach zum Hauptmenü Projekt / Eigenschaften / PyDev - PYTHONPATH und fügte alle für die App benötigten Pfade hinzu, wodurch das Problem behoben wurde!
Kostyantyn
6

Das hat bei mir funktioniert:

Schritt 1) ​​Entfernen Sie den Interpreter und konfigurieren Sie ihn erneut automatisch

Schritt 2) Fenster - Einstellungen - PyDev - Interpreter - Python-Interpreter Wechseln Sie zur Registerkarte Forced Builtins. Klicken Sie auf Neu ... Geben Sie den Namen des Moduls ein (in meinem Fall Flüche) und klicken Sie auf OK

Schritt 3) Klicken Sie im Projektexplorer mit der rechten Maustaste auf das Modul, bei dem Fehler auftreten. Gehen Sie zu PyDev-> Code-Analyse.

SJP
quelle
hat auch für mich funktioniert, danke, dass Sie jeden Schritt expliziter gemacht haben als in der aktuell akzeptierten Antwort.
sc28
1

Ich hatte das gleiche Problem. Ich verwende Python und Eclipse unter Windows. Der Code lief einwandfrei, aber Eclipse zeigt überall Fehler. Nachdem ich den Namen des Ordners 'Lib' in 'lib' (C: \ Python27 \ lib) geändert hatte, wurde das Problem behoben. Es scheint, dass wenn die Groß- und Kleinschreibung der Buchstaben nicht mit der in der Konfigurationsdatei übereinstimmt, dies manchmal zu Problemen führt (dies scheint jedoch nicht immer der Fall zu sein, da die Fehlerprüfung lange Zeit in Ordnung war, bevor die Probleme plötzlich nicht mehr offensichtlich waren Grund).

Leon
quelle
4
Dies ist Eclipse's Lieblingsbeschäftigung. Fehlerflags werden plötzlich ohne Grund angezeigt. Es macht die Leute verrückt zu denken, dass sie DIE WELT gebrochen haben, außer es ist ein Unsinn-Fehler-Flag, das Eclipse plötzlich aus Spaß und Gewinn zufällig implementiert hat (?)
R Thiede
Ich habe es versucht und dachte, es hätte funktioniert, aber es war nur ein Trick , aber es dauerte> 5 Minuten, also kann ich nicht rückgängig machen. @ Fabio Zadrozny ctrl-1 @UndefinedVariable hat jedoch perfekt funktioniert und funktioniert auch nach 5 Minuten weiter!
Mark Mikofski
1

Eine Annäherung an das, was ich tat:

import module.submodule

class MyClass:
    constant = submodule.constant

Zu welchem ​​Pylint sagte: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Ich habe dies behoben, indem ich meinen Import wie folgt geändert habe:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Hinweis: Ich habe auch nach importierter Variable umbenannt, um einen Großbuchstaben zu erhalten, der dessen konstante Natur widerspiegelt.

ThorSummoner
quelle
0

Möglicherweise müssen Sie nur Ihren Python-Pfad in Eclipse neu konfigurieren. Siehe meine Antwort auf eine ähnliche Frage.

oob
quelle
0

Fügen Sie in den Einstellungen -> PyDev -> PyLint unter Argumenten, die an PyLint übergeben werden sollen , diese Zeile hinzu:

--generated-members=objects

Sie müssen dies für jedes generierte tun. Ich habe das durch googeln gefunden, aber ich habe die Referenz verloren.

Mark Mikofski
quelle
0

Klicken Sie im Projektexplorer mit der rechten Maustaste auf das Modul, bei dem Fehler auftreten. Gehen Sie zu PyDev-> Fehlermarkierungen entfernen.

Chet
quelle
0

Meine Antwort trägt nichts Neues bei, nur ein konkretes Beispiel, auf das ich gestoßen bin.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev zeigte die Fehlermeldung "Undefinierte Variable vom Import: get_default_root_window ()" an.

In der Python-Shell können Sie sehen, dass dies ein eingebautes Modul ist, wie in der obigen Antwort erwähnt:

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

Jetzt habe ich unter Fenster-> Einstellungen-> PyDev-> Interpreter-> Python-Interpreter die Registerkarte 'Forced Builtins' ausgewählt und 'gtk.gdk' zur Liste hinzugefügt.

Jetzt wurde die Fehlermeldung nicht mehr angezeigt.

chrimuelle
quelle
0

Ich finde, dass diese 2 Schritte die ganze Zeit für mich funktionieren:

  1. Bestätigen Sie den übergeordneten Ordner des Moduls zum PYTHONPATH (fügen Sie ihn hinzu).
  2. Fügen Sie den erzwungenen Buildins den vollständigen Namen des Moduls hinzu.

Die Dinge, die hier zu beachten sind:

  • Einige beliebte Module werden mit einem übergeordneten und untergeordneten Paar mit demselben Namen installiert. In diesen Fällen müssen Sie dieses übergeordnete Element zusätzlich zu seinem Großelternordner, den Sie bereits für alles andere bestätigt / hinzugefügt haben, zu PYTHONPATH hinzufügen.

  • Verwenden Sie (zum Beispiel) "google.appengine.api.memcache" beim Hinzufügen zu erzwungenen Buildins, NICHT nur "memcache", wobei "google" in diesem Beispiel ein unmittelbares untergeordnetes Element eines in PYTHONPATH definierten Ordners ist.

Aikude
quelle
Wie kann ich lib.site-packages._pytest zu erzwungenen Buildins hinzufügen ... es akzeptiert kein '-' Symbol ... Ich habe ein Importproblem mit dem Konfigurationsmodul und versuche, Abhilfe zu schaffen, bitte helfen Sie
Eifer