Jak naprawić błędy PyDev „Undefined variable from import”?

138

Mam projekt w Pythonie używający PyDev w Eclipse, a PyDev ciągle generuje fałszywe błędy dla mojego kodu. Mam moduł, settingsktóry definiuje settingsobiekt. Importuję to w module bi przypisuję atrybut z:

from settings import settings
settings.main = object()

W części mojego kodu - ale nie we wszystkich - stwierdzenia takie jak:

from settings import settings
print settings.main 

... generuje komunikaty „Undefined variable from import: main” w panelu błędów kodu Eclipse, mimo że kod działa bez problemu. Jak mogę to poprawić?

Chris B.
źródło
Nie widziałem nic związanego z pylintem w tych odpowiedziach: \ Myślę, że stąd pochodzi ta uwaga i miałem nadzieję, że dowiem się, jak powiedzieć pylintowi, że to nie jest zmienna, tylko import.
ThorSummoner

Odpowiedzi:

156

W przypadku kodu w projekcie jedynym sposobem jest dodanie deklaracji, która mówi, że się tego spodziewałeś - prawdopodobnie chroniony przez if Falsekod, aby nie był wykonywany (statyczna analiza kodu widzi tylko to, co widzisz, a nie informacje o czasie wykonywania - jeśli otworzyłeś ten moduł samodzielnie, nie miałbyś żadnego wskazania, że ​​główny był oczekiwany).

Aby temu zaradzić, istnieje kilka możliwości:

  1. Jeśli jest to jakiś moduł zewnętrzny, można go dodać do modułu forced builtins, aby PyDev utworzył powłokę, aby uzyskać informacje o czasie wykonywania (szczegóły można znaleźć na stronie http://pydev.org/manual_101_interpreter.html ) - tj. Głównie PyDev zaimportuj moduł w powłoce i wykonaj dir(module)ai dirna klasach znajdujących się w module, aby przedstawić uzupełnienia i przeprowadzić analizę kodu.

  2. Możesz użyć Ctrl + 1 (Cmd + 1 na Macu) w wierszu z błędem, a PyDev wyświetli opcję dodania komentarza, aby zignorować ten błąd.

  3. Możliwe jest utworzenie stubmodułu i dodanie go do predefineduzupełnień ( http://pydev.org/manual_101_interpreter.html również zawiera szczegóły na ten temat).

Fabio Zadrozny
źródło
1
czasami dodanie modułu do wymuszonych wbudowanych nie pomaga (zobacz ten błąd, na przykład sourceforge.net/tracker/ ... )
Boris Gorelik
@Fabio: A co z predefiniowanymi uzupełnieniami, czy można ich tutaj użyć? A jakie opcje są dostępne, jeśli zrobisz coś takiego, try: import a; except: a=mockModuleczy istnieje sposób, aby je ukryć bez komentarzy?
ted
8
Wypróbowałem Ctrl-1, co daje mi „@UndefinedVariable”, który dodaje anotację i działa. Dzięki.
RichMeister,
Mam ten sam problem z najnowszymi Eclipse i PyDev. Mogę nawigować między wszystkimi modułami, więc dlaczego analiza kodu nie może zrobić tego samego?
Adam,
3
Zanim przejdziesz do skrajności, upewnij się, że katalog jest w PYTHONPATH, a następnie zamknij / uruchom ponownie Eclipse, wykonaj Projekt> Pydev> Usuń znaczniki błędów , a numpy powinien teraz pojawić się we wbudowanych wymuszonych.
smci
49

Używam opencv, które opiera się na plikach binarnych itp., Więc mam skrypty, w których każda inna linia ma ten głupi błąd. Python jest językiem dynamicznym, więc takie sytuacje nie powinny być traktowane jako błędy.

Całkowicie usunąłem te błędy, przechodząc do:

Okno -> Preferencje -> PyDev -> Edytor -> Analiza kodu -> Niezdefiniowana -> Niezdefiniowana zmienna z importu -> Ignoruj

I to jest to.

Może to być również Okno -> Preferencje -> PyDev -> Edytor -> Analiza kodu -> Importy -> Nie znaleziono importu -> Ignoruj

ubershmekel
źródło
8
Dzięki za to. To jest proste i łatwe. Jednak zamiast zmienić ustawienie „Nie znaleziono importu” na „Ignoruj”, zmieniłem je na „Ostrzeżenie”. TERAZ NIC NIE POKAZUJE. :) Mam nadzieję, że otrzymam ostrzeżenie, jeśli mam PRAWDZIWY problem z importem.
Miłość i pokój - Joe Codeswell
1
Musiałem ponownie uruchomić Eclipse, aby zmiany zaczęły obowiązywać.
spettekaka
21

Wpis oznaczony jako odpowiedź zawiera obejście, a nie rozwiązanie.

U mnie działa to rozwiązanie:

  • Iść do Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Przejdź do Forced builtins zakładki
  • Kliknij New...
  • Wpisz nazwę modułu ( multiprocessingw moim przypadku) i kliknijOK

Nie tylko znikną komunikaty o błędach, ale także zostaną rozpoznani członkowie modułu.

stenci
źródło
1
Biorąc pod uwagę, że „post oznaczony jako odpowiedź” został napisany przez programistę PyDev, być może warto przyjrzeć się mu jeszcze raz. Nie podaje wyraźnych instrukcji w samym poście, ponieważ zawiera linki do podanych przez Ciebie instrukcji.
coredumperror
5
@CoreDumpError Nie obchodzi mnie, kto napisał post. Wypróbowałem to, co opisuje post, i działa, ale jest obejściem, a nie rozwiązaniem. To, co opisuję, może nie działać na innych komputerach, ale działa dla mnie i jest właściwym rozwiązaniem. Jeśli inny post zawiera link do rozwiązania zamiast go opisywać, to nie jest zgodne z wytycznymi, postępowałem zgodnie z wytycznymi opisując, co jest dla mnie dobre rozwiązanie, mając nadzieję, że pomoże to innym.
stenci
2
@Isaac Teraz już tak, opublikowałem odpowiedź przed jej edytowaniem.
stenci
Tak, to znacznie lepsze i czystsze rozwiązanie! Zamiast maskować lub ukrywać, oferuje legalną poprawkę. Musiałem dodać, reale raz nie zrobiłem już czerwonego atramentu na rzeczy takie jakre.M
Bostone
10

Miałem podobny problem z projektem Eclipse / PyDev. W tym projekcie katalog główny kodu Pythona był podkatalogiem projektu.

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

Kiedy projekt był debugowany lub uruchamiany, wszystko było w porządku, ponieważ katalog roboczy był ustawiony we właściwym miejscu. Jednak analiza kodu PyDev nie znalazła żadnych importów z module1 lub module2.

Rozwiązaniem była edycja właściwości projektu -> PyDev - sekcja PYTHONPATH i usunięcie / MyProject z zakładki folderów źródłowych i dodanie do niego / MyProject / src.

Jules
źródło
Chciałem tylko sprawdzić, czy to w rzeczywistości działa idealnie.
Amndeep7
Tak, po prostu przeszedłem do menu głównego Projekt / Właściwości / PyDev - PYTHONPATH i dodałem wszystkie ścieżki potrzebne do aplikacji, co rozwiązało problem!
Kostyantyn
6

To zadziałało dla mnie:

krok 1) Usunięcie interpretera i ponowna automatyczna konfiguracja

krok 2) Okno - Preferencje - PyDev - Interpreters - Python Interpreter Przejdź do zakładki Forced builtins Kliknij New ... Wpisz nazwę modułu (w moim przypadku curses) i kliknij OK

krok 3) Kliknij prawym przyciskiem myszy w eksploratorze projektów na dowolnym module, który powoduje błędy. Przejdź do PyDev-> Analiza kodu.

SJP
źródło
dla mnie też zadziałało, dziękuję, że każdy krok był bardziej wyraźny niż w obecnie przyjętej odpowiedzi.
sc28
1

Miałem ten sam problem. Używam Pythona i Eclipse w systemie Windows. Kod działał dobrze, ale zaćmienie wszędzie pokazuje błędy. Po zmianie nazwy folderu „Lib” na „lib” (C: \ Python27 \ lib) problem został rozwiązany. Wygląda na to, że jeśli wielkość liter nie zgadza się z tą w pliku konfiguracyjnym, czasami będzie to powodować problemy (ale wydaje się, że nie zawsze, ponieważ sprawdzanie błędów było dobrze przez długi czas, zanim problemy nagle pojawiły się i nie były oczywiste powód).

Leon
źródło
4
To ulubiona rozrywka Eclipse. Tworzenie flag błędów pojawia się nagle bez powodu. To doprowadza ludzi do szaleństwa, myśląc, że złamali ŚWIAT, z wyjątkiem bzdurnej flagi błędu, którą Eclipse nagle zdecydował się zaimplementować losowo dla zabawy i zysku (?)
R Thiede
Próbowałem tego i myślałem, że zadziałało, ale to był tylko podstęp , ale zajęło to> 5 minut, więc nie mogę cofnąć. Jednak @ Fabio Zadrozny ctrl-1 @UndefinedVariable działał idealnie i nadal działa nawet po 5 minutach!
Mark Mikofski
1

Przybliżenie tego, co robiłem:

import module.submodule

class MyClass:
    constant = submodule.constant

Do którego pylint powiedział: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Rozwiązałem ten problem, zmieniając import, na przykład:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Uwaga: Zmieniłem również nazwę za pomocą importowanej zmiennej, aby miała nazwę zapisaną wielkimi literami, aby odzwierciedlić jej stały charakter.

ThorSummoner
źródło
0

Możliwe, że wystarczy ponownie skonfigurować ścieżkę Pythona w Eclipse. Zobacz moją odpowiedź na podobne pytanie.

oob
źródło
0

w preferencjach -> PyDev -> PyLint pod argumentami do przekazania do PyLint dodaj tę linię:

--generated-members=objects

będziesz musiał to zrobić dla każdego wygenerowanego pliku. Znalazłem to, szukając w Google, ale zgubiłem odniesienie.

Mark Mikofski
źródło
0

Kliknij prawym przyciskiem myszy w eksploratorze projektu na dowolnym module, który powoduje błędy. Przejdź do PyDev-> Usuń znaczniki błędów.

Chet
źródło
0

Moja odpowiedź nie wnosi nic nowego, tylko konkretny przykład, z którym się spotkałem.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev wyświetlił komunikat o błędzie „Niezdefiniowana zmienna z importu: get_default_root_window ()”

W powłoce Pythona widać, że jest to moduł `` wbudowany '', jak wspomniano w odpowiedzi powyżej:

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

Teraz w Window-> Preferences-> PyDev-> Interpreters-> Python Interpreter, wybrałem zakładkę „Forced Builtins” i dodałem „gtk.gdk” do listy.

Teraz komunikat o błędzie już się nie wyświetlał.

chrimuelle
źródło
0

Uważam, że te 2 kroki działają dla mnie cały czas:

  1. Potwierdź (w przeciwnym razie dodaj) folder nadrzędny modułu do PYTHONPATH.
  2. Dodaj PEŁNĄ nazwę modułu do wymuszonych wbudowanych.

Rzeczy, na które należy zwrócić uwagę:

  • Niektóre popularne moduły są instalowane z parami rodziców i dzieci o tej samej nazwie. W takich przypadkach musisz również dodać tego rodzica do PYTHONPATH, oprócz jego folderu dziadków, który już potwierdziłeś / dodałeś do wszystkiego innego.

  • Użyj (na przykład) „google.appengine.api.memcache” podczas dodawania do wymuszonych wbudowanych elementów, a NIE tylko „memcache”, gdzie „google” w tym przykładzie jest bezpośrednim elementem podrzędnym folderu zdefiniowanego w PYTHONPATH.

Aikude
źródło
Jak mogę dodać lib.site-packages._pytest do wymuszonych wbudowanych ... nie akceptuje symbolu `` - '' ... Mam problem z importem z modułem konfiguracyjnym i próbuję rozwiązać problem, proszę o pomoc
gorliwość