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

138

У меня есть проект 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, даже если код работает без проблем. Как я могу это исправить?

Крис Б.
источник
В этих ответах я не увидел ничего, связанного с pylint: \ Я думаю, что это откуда взялось это уведомление, и я надеялся найти, как сообщить pylint, что это не переменная, а импорт.
ThorSummoner 01

Ответы:

156

Для кода в вашем проекте единственный способ - добавить объявление о том, что вы этого ожидали - возможно, защищенное, 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 также содержит подробности об этом).

Фабио Задрозный
источник
1
иногда добавление модуля к принудительным встроенным командам не помогает (см. эту ошибку, например sourceforge.net/tracker/… )
Борис Горелик
@Fabio: А как насчет предопределенных завершений, их можно здесь использовать? И какие есть варианты, если вы сделаете что-то вроде try: import a; except: a=mockModule: есть ли способ подавить их без комментариев?
ted
8
Я попробовал Ctrl-1, он дает мне «@UndefinedVariable», который добавляет аннотацию, и это работает. Спасибо.
RichMeister 03
У меня такая же проблема с последними версиями Eclipse и PyDev. Я могу перемещаться между всеми модулями, так почему же анализ кода не может сделать то же самое?
Адам
3
Прежде чем впадать в крайности, убедитесь, что каталог находится в PYTHONPATH, затем выйдите / перезапустите Eclipse, выполните Project> Pydev> Удалить маркеры ошибок , и numpy теперь должен появиться во встроенных функциях Forced.
smci 01
49

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

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

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

Вот и все.

Также может быть: Window -> Preferences -> PyDev -> Editor -> Code Analysis -> Imports -> Import not found -> Ignore

Убершмекель
источник
8
Спасибо за это. Это просто и легко. Однако вместо изменения параметра «Импорт не найден» на «Игнорировать» я изменил его на «Предупреждение». ТЕПЕРЬ НИЧЕГО НЕ ПРОЯВЛЯЕТСЯ. :) Надеюсь, я получу предупреждение, если у меня РЕАЛЬНАЯ проблема с импортом.
Любовь и мир - Джо Кодсуэлл,
1
Пришлось перезапустить Eclipse, чтобы изменения вступили в силу.
spettekaka
24

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

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

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

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

стенки
источник
1
Учитывая, что «сообщение, отмеченное как ответ» было написано разработчиком PyDev, возможно, вам стоит еще раз взглянуть на него. Он не дает явных инструкций в самом сообщении, потому что он ссылается на указанные вами инструкции.
coredumperror
5
@CoreDumpError Мне все равно, кто написал пост. Я попробовал то, что описано в сообщении, и это работает, но это обходной путь, а не решение. То, что я описываю, может не работать на других компьютерах, но работает для меня и является правильным решением. Если другая публикация ссылается на решение, а не на его описание, значит, оно не соответствует рекомендациям. Я следовал рекомендациям, описывая хорошее решение для меня, надеясь, что это поможет другим.
stenci
3
@Isaac Теперь это так, я опубликовал свой ответ до того, как он был отредактирован.
stenci
Да, это намного лучше и чище! Вместо маскировки или сокрытия он предлагает законное исправление. Мне пришлось добавить, reно однажды я больше не делал красных чернил для таких вещей, какre.M
Bostone
10

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

Жюль
источник
Просто хотел подтвердить, что это действительно работает идеально.
Amndeep7
Да, просто зашел в главное меню Project / Properties / PyDev - PYTHONPATH и добавил все пути, необходимые для приложения, что решило проблему!
Константин
6

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

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

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

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

SJP
источник
у меня тоже сработало, спасибо, что сделали каждый шаг более явным, чем в принятом в настоящее время ответе.
sc28
1

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

Леон
источник
4
Это любимое времяпрепровождение Эклипс. Флаги ошибок появляются внезапно без причины. Это сводит людей с ума, думая, что они сломали МИР, за исключением того, что 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. Смотрите мой ответ на аналогичный вопрос.

oob
источник
0

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

--generated-members=objects

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

Марк Микофски
источник
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)>

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

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

chrimuelle
источник
0

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

  1. Подтвердите (иначе добавьте) родительскую папку модуля в PYTHONPATH.
  2. Добавьте ПОЛНОЕ имя модуля к принудительным встроенным командам.

Здесь следует отметить:

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

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

Айкуде
источник
Как я могу добавить lib.site-packages._pytest в принудительные встроенные команды ... он не принимает символ '-' ... У меня проблема с импортом модуля конфигурации, и я пытаюсь исправить это, пожалуйста, помогите
рвение
0

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

введите описание изображения здесь

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

Анки
источник