Как исправить ошибки PyDev "Неопределенная переменная из импорта"?

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

from settings import settings
settings.main = object()

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

from settings import settings
print settings.main 

... генерировать сообщения "Undefined variable from import: main" в области ошибок кода Eclipse, даже если код работает без проблем. Как я могу исправить это?

12 ответов

Решение

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

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

  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 также содержит подробности об этом).

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

Я полностью удалил эти ошибки, зайдя в:

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

И это все.

Также это может быть: Окно -> Настройки -> PyDev -> Редактор -> Анализ кода -> Импорт -> Импорт не найден -> Игнорировать

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

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

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

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

У меня была похожая проблема с проектом Eclipse/PyDev. В этом проекте корневой каталог кода Python был подкаталогом проекта.

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

Когда проект был отлажен или запущен, все было в порядке, поскольку рабочий каталог был установлен в правильное место. Однако анализ кода PyDev не смог найти какой-либо импорт из module1 или module2.

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

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

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

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

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

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

Приближение того, что я делал:

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

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

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

  1. Подтвердите (еще добавьте) родительскую папку модуля в PYTHONPATH.
  2. Добавьте полное имя модуля к принудительным встроенным функциям.

Вещи, чтобы отметить здесь:

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

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

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

--generated-members=objects

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

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

Если вы уверены, что ваш скрипт работает и это ложная тревога, перейдите в "Настройки"> "PyDev"> "Редактор"> "Анализ кода". Понизьте ошибки до предупреждений.

https://i.s tack.imgur.com/7bSzI.png

http://www.pydev.org/manual_adv_code_analysis.html

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

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

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)>

Теперь в Window->Preferences->PyDev->Interpreters->Python Interpreter, я выбрал вкладку "Forced Builtins" и добавил "gtk.gdk" в список.

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

Другие вопросы по тегам