Як виправити помилки Pydev «Невизначена змінна з імпорту»?


138

У мене є проект Python, що використовує PyDev в Eclipse, і PyDev продовжує генерувати помилкові помилки для мого коду. У мене є модуль, settingsякий визначає settingsоб’єкт. Я імпортую це в модуль bі призначаю атрибут з:

from settings import settings
settings.main = object()

У деяких моїх кодах - але не у всьому, такі заяви:

from settings import settings
print settings.main 

... генерувати "Не визначена змінна з імпорту: основна" повідомлень на панелі помилок коду Eclipse, хоча код працює без проблем. Як я можу їх виправити?


У цих відповідях я не бачив нічого, пов’язаного з pylint: \ Я думаю, звідки походить це повідомлення, і я сподівався знайти, як сказати pylint, що це не змінна, це імпорт.
ThorSummoner

Відповіді:


156

Щодо коду у вашому проекті, єдиним способом є додавання декларації, яка говорить про те, що ви очікували, що - можливо, захищена if Falseтаким чином, щоб вона не виконувалася (статичний аналіз коду бачить лише те, що ви бачите, а не інформацію про час виконання - якщо ви відкрив цей модуль самостійно, ви б не мали вказівки на те, що головне очікувалося).

Для подолання цього є кілька варіантів:

  1. Якщо це якийсь зовнішній модуль, можна додати його до того, forced builtinsщо PyDev породжує оболонку для отримання інформації про час виконання (детальніше див. Http://pydev.org/manual_101_interpreter.html ) - тобто: здебільшого PyDev буде імпортувати модуль в оболонці і зробити dir(module)і dirна класах , знайдених в модулі для справжніх доробок і аналізу зробити код.

  2. Ви можете використовувати Ctrl + 1 (Cmd + 1 для Mac) у рядку з помилкою, і PyDev представить вам можливість додати коментар, щоб ігнорувати цю помилку.

  3. Можна створити stubмодуль і додати його до predefinedдоповнень ( http://pydev.org/manual_101_interpreter.html також має детальну інформацію про це).


1
іноді додавання модуля до примусових вбудованих програм не допомагає (див. цю помилку, наприклад, sourceforge.net/tracker/… )
Борис Горелік

@Fabio: Що з попередньо визначеними доповненнями вони могли б бути використані тут? І які варіанти є, якщо ви робите щось на зразок, try: import a; except: a=mockModuleчи є спосіб придушити їх без коментарів?
тед

8
Я спробував Ctrl-1, він дає мені "@UndefinedVariable", який додає анотацію, і це працює. Дякую.
RichMeister

У мене ж проблема з останніми Eclipse та PyDev. Я можу переміщуватися між усіма модулями, так чому аналіз коду не може зробити те саме?
Адам,

3
Перш ніж перейти до крайностей, переконайтесь, що каталог знаходиться в PYTHONPATH, а потім вийдіть / перезапустіть Eclipse, зробіть Project> Pydev> Видалити маркери помилок , і numpy тепер повинен з’являтися в примусових вбудованих.
smci

49

Я використовую opencv, який покладається на двійкові файли тощо, тому у мене є сценарії, де кожен інший рядок має цю нерозумну помилку. Python - це динамічна мова, тому такі випадки не слід вважати помилками.

Ці помилки я видалив зовсім, перейшовши до:

Вікно -> Налаштування -> PyDev -> Редактор -> Аналіз коду -> Не визначено -> Невизначена змінна з імпорту -> Ігнорувати

І це все.

Це також може бути, Вікно -> Налаштування -> PyDev -> Редактор -> Аналіз коду -> Імпорт -> Імпорт не знайдено -> Ігнорувати


8
Дякую за це Це просто і легко. Однак замість зміни параметра "Імпорт не знайдено" на "Ігнорувати" я змінив його на "Попередження". ЗАРАЗ ЗНАЙДАЄТЬСЯ :) Сподіваюсь, я отримаю попередження, якщо у мене дійсна проблема з імпортом.
Любов і спокій - Джо Кодесвелл

1
Довелося перезапустити Eclipse, щоб зміни вступили в силу.
spettekaka

21

Повідомлення, позначене як відповідь, дає вирішення, а не рішення.

Це рішення працює для мене:

  • Йти до Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Перейдіть на Forced builtinsвкладку
  • Натисніть на New...
  • Введіть назву модуля ( multiprocessingв моєму випадку) і натиснітьOK

Повідомлення про помилки не тільки зникнуть, але і члени модуля будуть розпізнані.


1
Враховуючи, що "пост, позначений як відповідь", був написаний розробником PyDev, вам, можливо, варто поглянути ще на це. Він не дає чітких вказівок у самій публікації, оскільки посилається на вказані вами інструкції.
coredumperror

5
@CoreDumpError Мені все одно, хто написав пост. Я спробував те, що описується у публікації, і це працює, але це рішення, а не рішення. Те, що я описую, може не працювати на інших комп’ютерах, але працює для мене і є правильним рішенням. Якщо інша публікація посилається на рішення замість того, щоб описувати його, то воно не відповідає вказівкам, я дотримувався вказівок, описуючи те, що є для мене хорошим рішенням, сподіваючись, що це допоможе іншим.
stenci

2
@Isaac Тепер це так, я написав свою відповідь ще до редагування.
stenci

Так, це набагато краще і чистіше рішення! Замість маскування чи приховування пропонується законний виправлення. Мені довелося додати, reале одного разу я більше не зробив червоної фарби для таких речей, якre.M
Бостон,

10

У мене була подібна проблема з проектом Eclipse / PyDev. У цьому проекті кореневий каталог коду python був підкаталогом проекту.

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

Коли проект налагоджувався або запускався, все було нормально, оскільки робочий каталог був встановлений у потрібне місце. Однак аналіз коду PyDev не зміг знайти жодного імпорту з модуля1 чи модуля2.

Рішенням було відредагувати властивості проекту -> PyDev - розділ PYTHONPATH та видалити / MyProject із вкладки папок джерела та замість цього додати / MyProject / src.


Просто хотів надати перевірку того, що це насправді працює чудово.
Amndeep7

Так, просто зайшов у головне меню Project / Properties / PyDev - PYTHONPATH і додав усі шляхи, необхідні для програми, що вирішило проблему!
Костянтин

6

Це працювало для мене:

крок 1) Видалення інтерпретатора, автоматичне налаштування його знову

крок 2) Вікно - Налаштування - PyDev - Інтерпретатори - Інтерпретатор Python Перейдіть на вкладку Примусові вбудовані клацніть на Створити ... Введіть назву модуля (прокльони в моєму випадку) та натисніть кнопку ОК

крок 3) Клацніть правою кнопкою миші в провіднику проектів на будь-якому модулі помилки. Перейдіть до PyDev-> Аналіз коду.


працював і для мене, дякую, що кожен крок був більш чітким, ніж у прийнятій на даний момент відповідь.
sc28

1

У мене була така ж проблема. Я використовую Python та Eclipse у Windows. Код працював просто чудово, але помилки показують затемнення скрізь. Після того, як я змінив назву папки "Lib" на "lib" (C: \ Python27 \ lib), проблема була вирішена. Здається, якщо велика літера не відповідає тій, що є в конфігураційному файлі, це іноді спричинить проблеми (але це здається не завжди, тому що перевірка помилок була довгою, перш ніж проблеми раптом з’явилися без очевидних причина).


4
Це улюблене проведення часу Eclipse. Створення прапорів помилок раптово з’являється без причини. Це зводить людей з розуму, думаючи, що вони зламали СВІТ, за винятком якогось дурницького прапора про помилку, який Eclipse раптом вирішив застосувати довільно для розваги та отримання прибутку (?)
R Thiede

Я спробував це, і подумав, що це спрацювало, але це було лише хитрістю , але це зайняло> 5 хвилин, тому я не можу скасувати. Однак @ Fabio Zadrozny ctrl-1 @UndefinedVariable працював чудово, і він продовжує працювати навіть через 5 хвилин!
Марк Мікофський

1

Наближення того, що я робив:

import module.submodule

class MyClass:
    constant = submodule.constant

На який пілінт сказав: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Я вирішив це, змінивши імпорт, наприклад:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Примітка. Я також перейменований імпортованою змінною, щоб мати велике ім'я, яке відображає її постійну природу.


0

Можливо, вам просто потрібно перенастроїти шлях python в межах Eclipse. Дивіться мою відповідь на подібне запитання.


0

у налаштуваннях -> PyDev -> PyLint під аргументами для переходу до PyLint додайте цей рядок:

--generated-members=objects

вам потрібно буде зробити це для кожного створеного. Я виявив це, гуглившись, але втратив орієнтир.


0

Клацніть правою кнопкою миші в досліднику проекту на будь-якому модулі помилки. Перейдіть до PyDev-> Видалити маркери помилок.


0

Моя відповідь не сприяє нічого нового, лише конкретний приклад, з яким я зіткнувся.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev показав повідомлення про помилку "Невизначена змінна з імпорту: get_default_root_window ()"

У оболонці python ви бачите, що це "вбудований" модуль, як зазначено у відповіді вище:

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

Тепер під вікном-> Налаштування-> PyDev-> Інтерпретатори-> Інтерпретатором Python, я вибрав вкладку "Примусові вбудовані" та додав "gtk.gdk" до списку.

Тепер повідомлення про помилку більше не з’являлося.


0

Я вважаю, що ці два кроки працюють для мене весь час:

  1. Підтвердьте (ще додайте) батьківську папку модуля в PYTHONPATH.
  2. Додайте ПОВНЕ ім'я модуля до вимушених вбудованих модулів.

Тут слід зазначити:

  • Деякі популярні модулі встановлюються з однією батьківською та дочірньою парою з однаковим іменем. У цих випадках ви також повинні додати цього батька до PYTHONPATH, крім своєї бабусі та дідусі, яку ви вже підтвердили / додали для всього іншого.

  • Використовуйте (наприклад) "google.appengine.api.memcache" при додаванні до примусових вбудованих файлів, а не лише "memcache", де "google" у цьому прикладі є безпосередньою дочірньою папкою, визначеною в PYTHONPATH.


Як я можу додати lib.site-package._pytest до примусових вбудованих файлів ... це не приймає символ "-" ... У мене виникає проблема з імпортом із модулем конфігурації та намагаюся виконати ваші засоби захисту, будь ласка, допоможіть
завзяття

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.