Как исправить ошибки PyDev "Undefined из импорта"?

У меня есть проект Python с использованием PyDev в Eclipse, и PyDev продолжает генерировать ложные ошибки для моего кода. У меня есть модуль settings, который определяет объект settings. Я импортирую это в модуле b и присваиваю атрибут с помощью:

from settings import settings
settings.main = object()

В некоторых моих кодах, но не все, такие утверждения, как:

from settings import settings
print settings.main 

... генерировать "Undefined переменную из импорта: основные" сообщения в области ошибок кода Eclipse, даже если код работает без проблем. Как я могу их исправить?

Ответ 1

Для кода в вашем проекте единственным способом является добавление объявления, в котором говорилось, что вы ожидали, что, возможно, защищены if False, чтобы он не выполнялся (статический анализ кода видит только то, что вы видите, а не runtime info - если вы сами открыли этот модуль, у вас не было бы указаний на то, что main ожидалось).

Чтобы преодолеть это, есть несколько вариантов:

  • Если это какой-то внешний модуль, можно добавить его в forced builtins, чтобы PyDev порождал оболочку для получения информации о времени выполнения (см. http://pydev.org/manual_101_interpreter.html) - то есть: в основном PyDev будет импортировать модуль в оболочку и сделать dir(module) и dir в классах, найденных в модуле, для представления завершений и создания кода анализ.

  • Вы можете использовать Ctrl + 1 (Cmd + 1 для Mac) в строке с ошибкой, и PyDev представит вам возможность добавить комментарий, чтобы игнорировать эту ошибку.

  • Возможно создание модуля stub и добавление его к завершению predefined (http://pydev.org/manual_101_interpreter.html также имеет подробности об этом).

Ответ 2

Я использую opencv, который использует двоичные файлы и т.д., поэтому у меня есть сценарии, где каждая другая строка имеет эту глупую ошибку. Python - динамический язык, поэтому такие случаи не должны считаться ошибками.

Я вообще удалил эти ошибки, перейдя к:

Окно → Настройки → PyDev → Редактор → Анализ кода → Undefined → Undefined Переменная из импорта → Игнорировать

И что это.

Это также может быть, Окно → Настройки → PyDev → Редактор → Анализ кода → Импорт → Импорт не найден → Игнорировать

Ответ 3

Сообщение, помеченное как ответ, дает обходное решение, а не решение.

Это решение работает для меня:

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

Не только сообщения об ошибках исчезнут, члены модуля также будут распознаны.

Ответ 4

У меня была аналогичная проблема с проектом 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.

Ответ 5

Это сработало для меня:

шаг 1) Удаление интерпретатора, автоматическая настройка его снова

шаг 2) Окно - Настройки - PyDev - Переводчики - Python Interpreter       Перейдите на вкладку Принудительные встроенные       Нажмите "Создать"...       Введите имя модуля (проклятия в моем случае) и нажмите OK

Шаг 3) Щелкните правой кнопкой мыши в проводнике проекта, в зависимости от того, какой модуль дает ошибки. Перейдите к PyDev- > Анализу кода.

Ответ 6

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

Ответ 7

Аппроксимация того, что я делал:

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

Примечание. Я также переименовал импортированную переменную, чтобы иметь заглавное имя, чтобы отразить его постоянный характер.

Ответ 8

Возможно, вам просто нужно переконфигурировать свой путь python в Eclipse. См. Мой ответ на аналогичный вопрос.

Ответ 9

в настройках → PyDev → PyLint по аргументам для перехода к PyLint добавьте эту строку:

--generated-members=objects

вам нужно будет сделать это для каждого сгенерированного. Я нашел это по googling, но я потерял ссылку.

Ответ 10

Щелкните правой кнопкой мыши в проводнике проекта в зависимости от того, какой модуль дает ошибки. Перейдите к PyDev- > Remove Error Markers.

Ответ 11

Мой ответ не вносит ничего нового, только конкретный пример, с которым я столкнулся.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev показал сообщение об ошибке "Undefined variable from import: get_default_root_window()"

В оболочке python вы можете увидеть, что это "встроенный" модуль, как указано в ответе выше:

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

Теперь в меню Window- > Preferences- > PyDev- > Interpreters- > Python Interpreter я выбрал вкладку "Принудительные встроенные функции" и добавил "gtk.gdk" в список.

Теперь сообщение об ошибке больше не отображается.

Ответ 12

Я нахожу, что эти 2 шага работают для меня все время:

  • Подтвердите (добавьте) родительскую папку модуля в PYTHONPATH.
  • Добавить ПОЛНОЕ имя модуля для принудительных встроенных функций.

Что нужно отметить здесь:

  • Некоторые популярные модули устанавливаются с родительской и дочерней парой с тем же именем. В этих случаях вы также должны добавить этого родителя к PYTHONPATH, в дополнение к своей папке grandparent, которую вы уже подтвердили/добавили для всего остального.

  • Используйте (например) "google.appengine.api.memcache" при добавлении к принудительным встроенным, а не только "memcache", где "google" в этом примере является непосредственным дочерним элементом папки, определенной в PYTHONPATH.