Как исправить ошибки 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 ожидалось).
Чтобы преодолеть это, есть несколько вариантов:
Если это какой-то внешний модуль, его можно добавить в
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 также содержит подробности об этом).
Я использую 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 шага работают для меня все время:
- Подтвердите (еще добавьте) родительскую папку модуля в PYTHONPATH.
- Добавьте полное имя модуля к принудительным встроенным функциям.
Вещи, чтобы отметить здесь:
Некоторые популярные модули устанавливаются с парой родительских и дочерних элементов с одинаковыми именами. В этих случаях вам также нужно добавить этого родителя в PYTHONPATH, в дополнение к папке его дедушки, которую вы уже подтвердили / добавили для всего остального.
Используйте (например) "google.appengine.api.memcache" при добавлении к принудительным встроенным функциям, а НЕ только "memcache", где "google" в этом примере является непосредственным дочерним элементом папки, определенной в PYTHONPATH.
В настройках -> PyDev -> PyLint под аргументами для перехода к PyLint добавьте эту строку:
--generated-members=objects
вам нужно будет сделать это для каждого сгенерированного. Я нашел это, прибегая к помощи, но я потерял ссылку.
Возможно, вам просто нужно переконфигурировать ваш путь к Python в Eclipse. Смотрите мой ответ на аналогичный вопрос.
Если вы уверены, что ваш скрипт работает и это ложная тревога, перейдите в "Настройки"> "PyDev"> "Редактор"> "Анализ кода". Понизьте ошибки до предупреждений.
Щелкните правой кнопкой мыши в проводнике проекта в зависимости от того, какой модуль выдает ошибки. Перейти к 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" в список.
Теперь сообщение об ошибке больше не отображается.