Comment puis-je corriger les erreurs PyDev "variable non définie à partir de l'importation"?
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 settings
qui définit une settings
objet. J'importe cela dans le module b
et attribue un attribut avec:
from settings import settings
settings.main = object()
dans certains de mes codes--mais pas tous, des déclarations comme:
from settings import settings
print settings.main
... générer des messages "variable non définie à partir de l'import: main" dans le volet d'erreur du code Eclipse, même bien que le code fonctionne sans problème. Comment puis-je corriger?
12 réponses
pour le code dans votre projet, la seule façon est d'ajouter une déclaration disant que vous vous attendiez à ce que -- peut-être protégé par un if False
de sorte qu'il ne s'exécute pas (l'analyse statique du code ne voit que ce que vous voyez, pas les informations d'exécution -- si vous avez ouvert ce module vous-même, vous n'avez aucune indication que main était attendu).
pour surmonter cela il y a quelques choix:
-
S'il s'agit d'un module externe, c'est possibilité de l'ajouter au
forced builtins
pour que PyDev lance un shell qui lui permettra d'obtenir des informations d'exécution (voir http://pydev.org/manual_101_interpreter.html pour plus de détails) -- c.-à-d. la plupart du temps, PyDev importera le module dans un shell et fera unedir(module)
etdir
sur les classes trouvées dans le module pour présenter les complétions et faire l'analyse de code. -
vous pouvez utiliser Ctrl+1 (Cmd+1 Pour Mac) dans une ligne avec une erreur et PyDev vous présente une option pour ajouter un commentaire pour ignorer cette erreur.
-
il est possible de créer un module
stub
et de l'Ajouter auxpredefined
completions ( http://pydev.org/manual_101_interpreter.html a aussi des détails à ce sujet).
j'utilise opencv qui s'appuie sur des binaires etc donc j'ai des scripts où chaque autre ligne a cette erreur stupide. Python est un langage dynamique donc de telles occasions ne devraient pas être considérées comme des erreurs.
j'ai supprimé ces erreurs en allant à:
Window -> Preferences -> PyDev -> Editeur -> L'Analyse De Code -> Undefined -> Undefined Variable À L'Importation -> Ignorer
et c'est tout.
Il peut aussi, Fenêtre -> Préférences -> PyDev -> Editeur -> l'Analyse de Code -> Importations -> Importer introuvable -> Ignorer
le post marqué comme réponse donne une solution, pas une solution.
Cette solution fonctionne pour moi:
- passer à
Window - Preferences - PyDev - Interpreters - Python Interpreter
- allez à l'onglet
Forced builtins
1519110920" - cliquez sur
New...
- tapez le nom du module (
multiprocessing
dans mon cas) et cliquez surOK
non seulement les messages d'erreur disparaîtront, les membres du module seront également reconnus.
j'avais un problème similaire avec un projet Eclipse/PyDev. Dans ce projet, le répertoire racine du code python est un sous-répertoire du projet.
--> MyProject
+ --> src Root of python code
+ --> module1 A module
+ --> module2 Another module
+ --> docs
+ --> test
quand le projet était débogué ou lancé, tout allait bien car le répertoire de travail était réglé à la bonne place. Toutefois, L'analyse du code PyDev n'a pas permis de trouver d'importations en provenance de module1 ou module2.
Solution était de modifier les propriétés du projet - > PyDev - PYTHONPATH l'article et supprimer /MyProject à partir de la source de l'onglet dossiers et ajouter /Monprojet/src de la place.
cela a fonctionné pour moi:
étape 1 )Suppression de l'interpréteur, reconfiguration automatique
à l'étape 2) de la Fenêtre Préférences - PyDev - Interprètes - Interpréteur Python Aller à l'onglet constructions forcées Cliquez sur Nouveau... Tapez le nom du module (malédictions 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 donnant des erreurs. Aller à PyDev - > analyse de Code.
j'ai eu le même problème. J'utilise Python et Eclipse sur Windows. Le code fonctionnait très bien, mais eclipse 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 il semble que ce ne soit pas toujours le cas, car la vérification des erreurs était bonne pendant longtemps avant que les problèmes apparaissent soudainement. pour aucune raison évidente).
une approximation de ce que je faisais:
import module.submodule
class MyClass:
constant = submodule.constant
dit pylint:
E: 4,15: Undefined variable 'submodule' (undefined-variable)
j'ai résolu ceci en changeant mon importation comme:
from module.submodule import CONSTANT
class MyClass:
constant = CONSTANT
Note: j'ai aussi renommé par imported variable pour avoir un nom en majuscule pour refléter sa nature constante.
dans Préférences --> PyDev --> PyLint sous arguments à passer à PyLint ajouter cette ligne:
--generated-members=objects
vous devrez faire ceci pour chaque généré . J'ai trouvé ceci sur google, mais j'ai perdu la référence.
faites un clic droit dans l'Explorateur de projet sur n'importe quel module donnant des erreurs. Aller à PyDev- > supprimer les marqueurs d'erreur.
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 montré le message d'erreur "variable non définie de l'import: 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, en vertu de la Fenêtre->Préférences->PyDev->Interprètes->Interpréteur Python, je sélectionnez l'onglet ' Forced Builtins 'et ajoutez' gtk.gdk " à la liste.
maintenant le message d'erreur ne s'affiche plus.
je trouve que ces 2 étapes travaillent pour moi tout le temps:
- confirmez (sinon ajoutez) le dossier parent du module dans PYTHONPATH.
- ajouter le nom complet du module aux builtins forcés.
les choses à noter ici:
-
" certains modules populaires installent avec un parent et une paire d'enfants ayant le même nom. Dans ces cas, vous devez aussi ajouter que parent à PYTHONPATH, en plus de son dossier grandparent, que vous avez déjà confirmé/ajouté pour tout le reste.
-
utiliser (par exemple) " google.appengine.API.memcache" lors de l'ajout à forced builtins, pas "memcache" seulement, où "google" dans cet exemple, est un enfant immédiat d'un dossier défini dans PYTHONPATH.