web-dev-qa-db-fra.com

Comment corriger les erreurs "Variable non définie d'importation" de PyDev?

J'ai un projet Python qui utilise PyDev dans Eclipse et PyDev continue à générer de fausses erreurs pour mon code. J'ai un module settings qui définit un settings. Je l’importe dans le module b et attribue un attribut avec:

from settings import settings
settings.main = object()

Dans certains de mes codes - mais pas dans leur totalité, des déclarations telles que:

from settings import settings
print settings.main 

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

133
Chris B.

Pour le code de votre projet, le seul moyen est d’ajouter une déclaration disant que vous vous y attendiez - éventuellement protégée par un if False Afin qu’elle ne s’exécute pas (l’analyse de code statique ne voit que ce que vous voyez, informations d'exécution - si vous avez ouvert ce module vous-même, vous ne saurez pas 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 builtins Pour que PyDev lui crée un shell afin d'obtenir des informations d'exécution (voir http://pydev.org/manual_101_interpreter.html pour plus de détails) - ie: PyDev importera le module dans un shell et effectuera une dir(module) et un dir sur les classes présentes dans le module afin de présenter les complétions et d'effectuer 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 afin d'ignorer cette erreur.

  3. Il est possible de créer un module stub et de l'ajouter aux compléments predefined ( http://pydev.org/manual_101_interpreter.html contient également des informations à ce sujet).

151
Fabio Zadrozny

J'utilise opencv qui s'appuie sur des binaires, etc., donc j'ai des scripts où chaque ligne a cette erreur idiote. Python est un langage dynamique, de telles occasions ne doivent pas être considérées comme des erreurs.

J'ai effacé ces erreurs en allant dans:

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

Et c'est ça.

Ce peut être aussi: Fenêtre -> Préférences -> PyDev -> Editeur -> Analyse de code -> Importations -> Import pas trouvé -> Ignorer

47
ubershmekel

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

Cette solution fonctionne pour moi:

  • Allez à Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Allez à l'onglet Forced builtins
  • Cliquez sur New...
  • Tapez le nom du module (multiprocessing dans mon cas) et cliquez sur OK

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

17
stenci

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 était débogué ou exécuté, tout allait bien car le répertoire de travail était placé au bon endroit. Cependant, l'analyse de code PyDev n'a pas permis de trouver des importations à partir du module 1 ou du module 2.

La solution consistait à modifier les propriétés du projet -> PyDev - PYTHONPATH, à supprimer/MyProject de l’onglet des dossiers sources et à y ajouter/MyProject/src.

9
Jules

Cela a fonctionné pour moi:

étape 1) Suppression de l'interpréteur, reconfiguration automatique

étape 2) Fenêtre - Préférences - PyDev - Interpreters - Python Interpreter) Allez à l’onglet Forced builtins Cliquez sur New ... 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 générant des erreurs. Allez à PyDev-> Analyse de code.

6
SJP

J'ai eu le même problème. J'utilise Python et Eclipse sous Windows. Le code fonctionnait parfaitement, mais Eclipse affiche 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 majuscule des lettres ne correspond pas à celle du fichier de configuration, cela posera parfois des problèmes (mais cela ne semble pas toujours, car la vérification des erreurs a longtemps avant que les problèmes apparaissent soudainement sans raison apparente).

1
Leon

Une approximation de ce que je faisais:

import module.submodule

class MyClass:
    constant = submodule.constant

Pour lequel pylint a déclaré: E: 4,15: Undefined variable 'submodule' (undefined-variable)

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

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Remarque: j'ai également renommé, par la variable importée, un nom en majuscule reflétant sa nature constante.

1
ThorSummoner

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

--generated-members=objects

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

0
Mark Mikofski

Cliquez avec le bouton droit de la souris dans l'explorateur de projet sur le module générant des erreurs. Aller à PyDev-> Supprimer les marqueurs d'erreur.

0
Chet

Il est possible que vous deviez simplement reconfigurer votre chemin python dans Eclipse. Voir mon réponse à une question similaire.

0
oob

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 python Shell, vous pouvez voir qu’il s’agit d’un module intégré, comme indiqué dans la réponse ci-dessus:

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

Maintenant, sous Fenêtre-> Préférences-> PyDev-> Interprètes-> Interprète Python, j'ai sélectionné l'onglet "Intégrations forcées" et ajouté "gtk.gdk" à la liste.

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

0
chrimuelle

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

  1. Confirmez (sinon ajoutez) le dossier parent du module dans PYTHONPATH.
  2. Ajoutez le nom complet du module aux intégrations forcées.

Les choses à noter ici:

  • Certains modules courants s'installent avec des paires parent et enfant portant le même nom. Dans ces cas, vous devez également ajouter ce parent à PYTHONPATH, en plus de son dossier de grands-parents, que vous avez déjà confirmé/ajouté pour tout le reste.

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

0
Aikude