Как исправить ошибки 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.