Comment corriger les erreurs PyDev «Variable non définie de l'importation»?

138

J'ai un projet Python utilisant PyDev dans Eclipse, et PyDev continue de générer de fausses erreurs pour mon code. J'ai un module settingsqui définit un settingsobjet. J'importe cela dans le module bet j'attribue un attribut avec:

from settings import settings
settings.main = object()

Dans certains de mes codes, mais pas dans tous, des déclarations comme:

from settings import settings
print settings.main 

... générer des messages "Variable non définie depuis import: main" dans le volet d'erreur de code Eclipse, même si le code s'exécute sans problème. Comment puis-je corriger ces problèmes?

Chris B.
la source
Je n'ai rien vu de lié à pylint dans ces réponses: \ Je pense que c'est de là que vient cet avis et j'espérais trouver comment dire à pylint que ce n'est pas une variable, c'est une importation.
ThorSummoner

Réponses:

156

Pour le code de votre projet, le seul moyen est d'ajouter une déclaration indiquant que vous vous attendiez à cela - éventuellement protégé par un if Falsepour qu'il ne s'exécute pas (l'analyse de code statique ne voit que ce que vous voyez, pas les informations d'exécution - si vous ouvert ce module vous-même, vous n’auriez aucune indication que main était attendu)

Pour surmonter cela, il y a quelques choix:

  1. S'il s'agit d'un module externe, il est possible de l'ajouter au forced builtinsafin que PyDev génère un shell pour lui permettre d'obtenir des informations d'exécution (voir http://pydev.org/manual_101_interpreter.html pour plus de détails) - c'est-à-dire: principalement, PyDev va importer le module dans un shell et faire un dir(module)et dirsur les classes trouvées dans le module pour présenter les complétions et faire l'analyse du code.

  2. Vous pouvez utiliser Ctrl + 1 (Cmd + 1 pour Mac) dans une ligne avec une erreur et PyDev vous présentera une option pour ajouter un commentaire pour ignorer cette erreur.

  3. Il est possible de créer un stubmodule et de l'ajouter aux predefinedcomplétions ( http://pydev.org/manual_101_interpreter.html a également des détails à ce sujet).

Fabio Zadrozny
la source
1
parfois l'ajout d'un module à des builtins forcés n'aide pas (voir ce bogue, par exemple sourceforge.net/tracker/… )
Boris Gorelik
@Fabio: Qu'en est-il des complétions prédéfinies pourraient-elles être utilisées ici? Et quelles sont les options si vous faites quelque chose comme try: import a; except: a=mockModuley a-t-il un moyen de les supprimer sans les commentaires?
ted
8
J'ai essayé Ctrl-1 cela me donne '@UndefinedVariable' qui ajoute une anotation et qui fonctionne. Merci.
RichMeister
Je rencontre le même problème avec les derniers Eclipse et PyDev. Je peux naviguer entre tous les modules, alors pourquoi l'analyse de code ne peut-elle pas faire la même chose?
Adam le
3
Avant d'aller aux extrêmes, assurez-vous que le répertoire est dans PYTHONPATH, puis quittez / redémarrez Eclipse, faites Projet> Pydev> Supprimer les marqueurs d'erreur , et numpy devrait maintenant apparaître dans les fonctions intégrées forcées.
smci
49

J'utilise opencv qui repose sur des binaires, etc. donc j'ai des scripts où toutes les autres lignes ont cette erreur stupide. Python est un langage dynamique, de telles occasions ne doivent donc pas être considérées comme des erreurs.

J'ai complètement supprimé ces erreurs en allant à:

Fenêtre -> Préférences -> PyDev -> Editeur -> Analyse de code -> Indéfini -> Variable non définie depuis l'importation -> Ignorer

Et c'est ça.

Cela peut aussi être, Fenêtre -> Préférences -> PyDev -> Editeur -> Analyse de code -> Importations -> Importation introuvable -> Ignorer

ubershmekel
la source
8
Merci pour cela. C'est simple et facile. Cependant, au lieu de changer le paramètre «Importation introuvable» sur «Ignorer», je l'ai changé en «Avertissement». MAINTENANT, RIEN NE SE RÉVATE. :) J'espère que j'aurai un avertissement si j'ai un VRAI problème d'importation.
Amour et paix - Joe Codeswell
1
J'ai dû redémarrer Eclipse pour que les modifications prennent effet.
spettekaka
21

Le message marqué comme réponse offre une solution de contournement, pas une solution.

Cette solution fonctionne pour moi:

  • Aller à Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Aller à l' Forced builtinsonglet
  • Cliquer sur New...
  • Tapez le nom du module ( multiprocessingdans mon cas) et cliquez surOK

Non seulement les messages d'erreur disparaîtront, mais les membres du module seront également reconnus.

pochoir
la source
1
Considérant que le "message marqué comme réponse" a été rédigé par le développeur de PyDev, vous devriez peut-être le revoir. Il ne donne pas d'instructions explicites dans le message lui-même car il renvoie aux instructions que vous avez spécifiées.
coredumperror
5
@CoreDumpError Je me fiche de savoir qui a écrit un message. J'ai essayé ce que le message décrit, et cela fonctionne, mais c'est une solution de contournement, pas une solution. Ce que je décris peut ne pas fonctionner pour d'autres ordinateurs, mais fonctionne pour moi et est la bonne solution. Si l'autre article renvoie à la solution au lieu de la décrire, alors il ne suit pas les directives, j'ai suivi les directives en décrivant ce qui est une bonne solution pour moi, en espérant que cela aidera les autres.
stenci
2
@Isaac Maintenant, j'ai posté ma réponse avant qu'elle ne soit modifiée.
stenci
Oui, c'est une solution bien meilleure et plus propre! Au lieu de masquer ou de cacher, il offre la solution légitime. J'ai dû ajouter remais une fois je n'ai plus fait d'encre rouge pour des choses commere.M
Bostone
10

J'avais un problème similaire avec un projet Eclipse / PyDev. Dans ce projet, le répertoire racine du code python était un sous-répertoire du projet.

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

Lorsque le projet a été débogué ou exécuté, tout allait bien car le répertoire de travail était placé au bon endroit. Cependant, l'analyse du code PyDev n'a pas réussi à trouver les importations de module1 ou module2.

La solution était de modifier les propriétés du projet -> PyDev - section PYTHONPATH et de supprimer / MyProject de l'onglet des dossiers source et d'y ajouter / MyProject / src à la place.

Jules
la source
Je voulais juste vérifier que cela fonctionne parfaitement.
Amndeep7
Oui, il vous suffit d'aller dans le menu principal Projet / Propriétés / PyDev - PYTHONPATH et d'ajouter tous les chemins nécessaires à l'application, ce qui a résolu le problème!
Kostyantyn
6

Cela a fonctionné pour moi:

étape 1) Retrait de l'interpréteur, configuration automatique à nouveau

étape 2) Fenêtre - Préférences - PyDev - Interpréteurs - Interpréteur Python Allez dans l'onglet Forcés intégrés Cliquez sur Nouveau ... Tapez le nom du module (curses dans mon cas) et cliquez sur OK

étape 3) Cliquez avec le bouton droit de la souris dans l'explorateur de projet sur le module qui génère des erreurs. Allez dans PyDev-> Analyse de code.

SJP
la source
a fonctionné pour moi aussi, merci de rendre chaque étape plus explicite que dans la réponse actuellement acceptée.
sc28
1

J'ai eu le même problème. J'utilise Python et Eclipse sur Windows. Le code fonctionnait très bien, mais éclipse montre des erreurs partout. Après avoir changé le nom du dossier «Lib» en «lib» (C: \ Python27 \ lib), le problème a été résolu. Il semble que si la capitalisation des lettres ne correspond pas à celle du fichier de configuration, cela posera parfois des problèmes (mais cela ne semble pas toujours le cas, car la vérification des erreurs était correcte pendant longtemps avant que les problèmes n'apparaissent soudainement pour rien d'évident raison).

Léon
la source
4
C'est le passe-temps préféré d'Eclipse. Faire apparaître des indicateurs d'erreur sans raison. Cela rend les gens fous en pensant qu'ils ont brisé LE MONDE, sauf que c'est un indicateur d'erreur absurde qu'Eclipse a soudainement décidé de mettre en œuvre au hasard pour le plaisir et le profit (?)
R Thiede
J'ai essayé ceci et j'ai pensé que cela avait fonctionné, mais ce n'était qu'une ruse , mais cela a pris> 5 minutes, donc je ne peux pas annuler. Cependant, @ Fabio Zadrozny ctrl-1 @UndefinedVariable a parfaitement fonctionné et continue de fonctionner même après 5 minutes!
Mark Mikofski
1

Une approximation de ce que je faisais:

import module.submodule

class MyClass:
    constant = submodule.constant

À quel pylint a dit: E: 4,15: Undefined variable 'submodule' (undefined-variable)

J'ai résolu ce problème en modifiant mon importation comme:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Remarque: j'ai également renommé par variable importée pour avoir un nom en majuscule pour refléter sa nature constante.

ThorSummoner
la source
0

Il est possible que vous ayez simplement besoin de reconfigurer votre chemin python dans Eclipse. Voir ma réponse à une question similaire.

oob
la source
0

dans les préférences -> PyDev -> PyLint sous les arguments à passer à PyLint ajoutez cette ligne:

--generated-members=objects

vous devrez le faire pour chaque fichier généré. J'ai trouvé cela en googlant, mais j'ai perdu la référence.

Mark Mikofski
la source
0

Cliquez avec le bouton droit dans l'explorateur de projet sur le module qui génère des erreurs. Allez dans PyDev-> Supprimer les marqueurs d'erreur.

Chet
la source
0

Ma réponse n'apporte rien de nouveau, juste un exemple concret que j'ai rencontré.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev a affiché le message d'erreur "Variable non définie de l'importation: get_default_root_window ()"

Dans le shell python, vous pouvez voir qu'il s'agit d'un module `` intégré '' comme mentionné dans une réponse ci-dessus:

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

Maintenant, sous Window-> Preferences-> PyDev-> Interpreters-> Python Interpreter, j'ai sélectionné l'onglet 'Forced Builtins' et ajouté 'gtk.gdk' à la liste.

Maintenant, le message d'erreur ne s'affichait plus.

chrimuelle
la source
0

Je trouve que ces 2 étapes fonctionnent pour moi tout le temps:

  1. Confirmez (sinon ajoutez) le dossier parent du module au PYTHONPATH.
  2. Ajoutez le nom COMPLET du module aux fonctions intégrées forcées.

Les choses à noter ici:

  • Certains modules populaires s'installent avec une paire parent / enfant ayant le même nom. Dans ces cas, vous devez également ajouter ce parent à PYTHONPATH, en plus de son dossier grand-parent, que vous avez déjà confirmé / ajouté pour tout le reste.

  • Utilisez (par exemple) "google.appengine.api.memcache" lors de l'ajout à des fonctions intégrées forcées, PAS "memcache" uniquement, où "google" dans cet exemple est un enfant immédiat d'un dossier défini dans PYTHONPATH.

Aikude
la source
Comment puis-je ajouter lib.site-packages._pytest aux builtins forcés ... il n'accepte pas le symbole '-' ... J'ai un problème d'importation avec le module de configuration et j'essaie de faire votre remède, s'il vous plaît aidez-vous
zèle