¿Cómo soluciono los errores de PyDev "Variable indefinida de importación"?

138

Tengo un proyecto de Python usando PyDev en Eclipse, y PyDev sigue generando errores falsos para mi código. Tengo un módulo settingsque define un settingsobjeto. Importo eso en el módulo by asigno un atributo con:

from settings import settings
settings.main = object()

En algunos de mis códigos, pero no en todos, declaraciones como:

from settings import settings
print settings.main 

... genera mensajes "Variable indefinida de import: main" en el panel de error de código de Eclipse, aunque el código se ejecute sin problemas. ¿Cómo puedo corregir esto?

Chris B.
fuente
No vi nada relacionado con pylint en estas respuestas: \ Creo que es de donde se origina este aviso y esperaba encontrar cómo decirle a pylint que eso no es una variable, es una importación.
ThorSummoner 01 de

Respuestas:

156

Para el código en su proyecto, la única forma es agregar una declaración que diga que esperaba eso, posiblemente protegido por una if Falsepara que no se ejecute (el análisis de código estático solo ve lo que ve, no la información de tiempo de ejecución) si abrió ese módulo usted mismo, no tendría indicación de que se esperaba main).

Para superar esto, hay algunas opciones:

  1. Si se trata de un módulo externo, es posible agregarlo forced builtinspara que PyDev genere un shell para obtener información de tiempo de ejecución (consulte http://pydev.org/manual_101_interpreter.html para obtener más detalles), es decir, principalmente, PyDev lo hará importe el módulo en un shell y realice un dir(module)y diren las clases que se encuentran en el módulo para presentar las terminaciones y realizar el análisis de código.

  2. Puede usar Ctrl + 1 (Cmd + 1 para Mac) en una línea con un error y PyDev le presentará una opción para agregar un comentario para ignorar ese error.

  3. Es posible crear un stubmódulo y agregarlo a las predefinedterminaciones ( http://pydev.org/manual_101_interpreter.html también tiene detalles sobre eso).

Fabio Zadrozny
fuente
1
a veces, agregar un módulo a las construcciones forzadas no ayuda (vea este error, por ejemplo sourceforge.net/tracker/… )
Boris Gorelik
@Fabio: ¿Qué pasa con las terminaciones predefinidas podrían usarse aquí? ¿Y qué opciones hay si haces algo como si try: import a; except: a=mockModulehay alguna forma de suprimirlas sin los comentarios?
Ted
8
Intenté Ctrl-1, me da '@UndefinedVariable' que agrega una anotación y eso funciona. Gracias.
RichMeister
Estoy experimentando el mismo problema con el último Eclipse y PyDev. Puedo navegar entre todos los módulos, entonces ¿por qué el análisis de código no puede hacer lo mismo?
Adam
3
Antes de llegar a los extremos, asegúrese de que el directorio esté en PYTHONPATH, luego salga / reinicie Eclipse, haga Proyecto> Pydev> Eliminar marcadores de error , y ahora debería aparecer numpy en los componentes forzados.
smci 01 de
49

Estoy usando opencv que se basa en binarios, etc., así que tengo scripts donde cada otra línea tiene este error tonto. Python es un lenguaje dinámico, por lo que tales ocasiones no deben considerarse errores.

Eliminé estos errores por completo yendo a:

Ventana -> Preferencias -> PyDev -> Editor -> Análisis de código -> Indefinido -> Variable indefinida de importación -> Ignorar

Y eso es eso.

También puede ser, Ventana -> Preferencias -> PyDev -> Editor -> Análisis de código -> Importaciones -> Importación no encontrada -> Ignorar

ubershmekel
fuente
8
Gracias por esto. Es sencillo y fácil. Sin embargo, en lugar de cambiar la configuración "Importar no encontrado" a "Ignorar", la cambié a "Advertencia". AHORA NADA SE MUESTRA. :) Con suerte, recibiré una Advertencia si tengo un problema de importación REAL.
Amor y paz - Joe Codeswell
1
Tuve que reiniciar Eclipse para que los cambios surtan efecto.
spettekaka
21

La publicación marcada como respuesta ofrece una solución, no una solución.

Esta solución me funciona:

  • Ir Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Ir a la Forced builtinspestaña
  • Haga clic en New...
  • Escriba el nombre del módulo ( multiprocessingen mi caso) y haga clicOK

No solo desaparecerán los mensajes de error, los miembros del módulo también serán reconocidos.

stenci
fuente
1
Teniendo en cuenta que la "publicación marcada como respuesta" fue escrita por el desarrollador de PyDev, tal vez deberías echarle otro vistazo. No da instrucciones explícitas en la publicación en sí porque se vincula a las instrucciones que especificó.
coredumperror
55
@CoreDumpError No me importa quién escribió una publicación. Intenté lo que describe la publicación, y funciona, pero es una solución, no una solución. Lo que describo podría no funcionar para otras computadoras, pero funciona para mí y es la solución correcta. Si la otra publicación enlaza con la solución en lugar de describirla, entonces no sigue las pautas, seguí las pautas describiendo cuál es una buena solución para mí, esperando que eso ayude a otros.
stenci
2
@Isaac Ahora sí, publiqué mi respuesta antes de que se editara.
stenci
Sí, esta es una solución mucho mejor y más limpia. En lugar de enmascarar u ocultar, ofrece la solución legítima. Tuve que agregar, repero una vez que no hice más tinta roja para cosas comore.M
Bostone
10

Estaba teniendo un problema similar con un proyecto Eclipse / PyDev. En este proyecto, el directorio raíz del código de Python era un subdirectorio del proyecto.

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

Cuando el proyecto se depuró o ejecutó, todo estaba bien, ya que el directorio de trabajo estaba en el lugar correcto. Sin embargo, el análisis del código PyDev no pudo encontrar ninguna importación desde el módulo1 o el módulo2.

La solución fue editar las propiedades del proyecto -> PyDev - sección PYTHONPATH y eliminar / MyProject de la pestaña de carpetas de origen y agregar / MyProject / src en su lugar.

Jules
fuente
Solo quería proporcionar una verificación de que esto, de hecho, funciona perfectamente.
Amndeep7
Sí, simplemente fui al menú principal Proyecto / Propiedades / PyDev - PYTHONPATH y agregó todas las rutas necesarias para la aplicación, ¡lo que resolvió el problema!
Kostyantyn
6

Esto funcionó para mí:

paso 1) Eliminando el intérprete, configurándolo automáticamente nuevamente

paso 2) Ventana - Preferencias - PyDev - Intérpretes - Intérprete de Python Vaya a la pestaña Construidos forzados Haga clic en Nuevo ... Escriba el nombre del módulo (maldiciones en mi caso) y haga clic en Aceptar

paso 3) Haz clic derecho en el explorador de proyectos en cualquier módulo que esté dando errores. Vaya a PyDev-> Análisis de código.

SJP
fuente
También funcionó para mí, gracias por hacer cada paso más explícito que en la respuesta actualmente aceptada.
sc28
1

Yo tuve el mismo problema. Estoy usando Python y Eclipse en Windows. El código funcionaba bien, pero eclipse muestra errores en todas partes. Después de cambiar el nombre de la carpeta 'Lib' a 'lib' (C: \ Python27 \ lib), el problema se resolvió. Parece que si el uso de mayúsculas en las letras no coincide con el del archivo de configuración, esto a veces causará problemas (pero parece que no siempre es así, porque la comprobación de errores estuvo bien durante mucho tiempo antes de que los problemas aparecieran repentinamente para nada obvio). razón).

León
fuente
44
Este es el pasatiempo favorito de Eclipse. Hacer que las banderas de error aparezcan repentinamente sin ninguna razón. Enloquece a la gente pensando que rompieron EL MUNDO, excepto que es una marca de error sin sentido que Eclipse de repente decidió implementar aleatoriamente por diversión y ganancias (?)
R Thiede
Intenté esto y pensé que había funcionado, pero fue solo una artimaña , pero tardó> 5 minutos, así que no puedo deshacer. Sin embargo, @ Fabio Zadrozny ctrl-1 @UndefinedVariable funcionó perfectamente, ¡y continúa funcionando incluso después de 5 minutos!
Mark Mikofski
1

Una aproximación de lo que estaba haciendo:

import module.submodule

class MyClass:
    constant = submodule.constant

A lo que pylint dijo: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Resolví esto cambiando mi importación como:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Nota: También cambié el nombre por variable importada para tener un nombre en mayúscula para reflejar su naturaleza constante.

ThorSummoner
fuente
0

Es posible que solo necesite reconfigurar su ruta de Python dentro de Eclipse. Vea mi respuesta a una pregunta similar.

oob
fuente
0

en preferencias -> PyDev -> PyLint bajo argumentos para pasar a PyLint agregue esta línea:

--generated-members=objects

necesitará hacer esto para cada generado. Encontré esto buscando en Google, pero perdí la referencia.

Mark Mikofski
fuente
0

Haga clic derecho en el explorador de proyectos en cualquier módulo que esté dando errores. Vaya a PyDev-> Eliminar marcadores de error.

Chet
fuente
0

Mi respuesta no aporta nada nuevo, solo un ejemplo concreto que encontré.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev mostró el mensaje de error "Variable indefinida de la importación: get_default_root_window ()"

En el shell de Python puede ver que este es un módulo 'incorporado' como se menciona en una respuesta anterior:

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

Ahora en Ventana-> Preferencias-> PyDev-> Intérpretes-> Intérprete de Python, seleccioné la pestaña 'Forzado Builtins' y agregué 'gtk.gdk' a la lista.

Ahora el mensaje de error ya no se mostraba.

chrimuelle
fuente
0

Encuentro que estos 2 pasos funcionan para mí todo el tiempo:

  1. Confirme (de lo contrario, agregue) la carpeta principal del módulo a PYTHONPATH.
  2. Agregue el nombre COMPLETO del módulo a las construcciones forzadas.

Las cosas a tener en cuenta aquí:

  • Algunos módulos populares se instalan con algunos pares padre e hijo que tienen el mismo nombre. En estos casos, también debe agregar ese padre a PYTHONPATH, además de su carpeta de abuelos, que ya confirmó / agregó para todo lo demás.

  • Use (por ejemplo) "google.appengine.api.memcache" cuando agregue a los builtins forzados, NO solo "memcache", donde "google" en este ejemplo, es un hijo inmediato de una carpeta definida en PYTHONPATH.

Aikude
fuente
¿Cómo puedo agregar lib.site-packages._pytest a los builtins forzados ... no está aceptando el símbolo '-' ... Tengo un problema de importación con el módulo de configuración e intento hacer su solución, por favor ayuda
celo