Ошибка PyLint «Не удалось импортировать» – как установить PYTHONPATH?

Я запускаю PyLint из Wing IDE в Windows. У меня есть подкаталог (пакет) в моем проекте, и внутри пакета я импортирую модуль с верхнего уровня, т. Е.

__init__.py myapp.py one.py subdir\ __init__.py two.py 

Внутри two.py меня есть import one и это отлично работает во время выполнения, потому что каталог верхнего уровня (из которого myapp.py ) находится в пути Python. Однако, когда я запускаю PyLint на two.py, это дает мне ошибку:

 F0401: Unable to import 'one' 

Как это исправить?

  • Как избежать «Разрешения отказа» при использовании pip с virtualenv
  • Как добавить путь к PYTHONPATH в virtualenv
  • Django, mod_wsgi и виртуальный env
  • OpenCV и python / virtualenv?
  • Ошибка установки Matplotlib с помощью virtualenv
  • Python - вручную установить пакет с помощью virtualenv
  • Активация виртуального env не работает
  • Отмените опцию `--no-site-packages` с virtualenv
  • 13 Solutions collect form web for “Ошибка PyLint «Не удалось импортировать» – как установить PYTHONPATH?”

    Есть два варианта, о которых я знаю.

    PYTHONPATH первых, измените переменную среды PYTHONPATH чтобы включить каталог над вашим модулем.

    Кроме того, отредактируйте ~/.pylintrc чтобы включить каталог над вашим модулем, например:

     [General] init-hook='import sys; sys.path.append("/path/to/root")' 

    (Или в другой версии pylint, init-hook требует, чтобы вы изменили [General] на [MASTER])

    Оба эти варианта должны работать.

    Надеюсь, это поможет.

    У вас есть пустой файл __init__.py в обоих каталогах, чтобы позволить python знать, что dirs являются модулями?

    Основной контур, когда вы не работаете из папки (т. Е., Может быть, из pylint, хотя я не использовал это):

     topdir\ __init__.py functions_etc.py subdir\ __init__.py other_functions.py 

    Это то, как интерпретатор python знает модуль без ссылки на текущий каталог, поэтому, если pylint работает от своего абсолютного пути, он сможет получить доступ к functions_etc.py как topdir.functions_etc или topdir.subdir.other_functions , если topdir находится на PYTHONPATH .

    ОБНОВЛЕНИЕ: Если проблема не является файлом __init__.py , возможно, просто попробуйте скопировать или переместить ваш модуль в c:\Python26\Lib\site-packages – это обычное место для размещения дополнительных пакетов и, безусловно, будет на вашем PYTHONPATH. Если вы знаете, как делать символические ссылки Windows или эквивалентные (я этого не делаю!), Вы можете сделать это вместо этого. Здесь есть еще много вариантов : http://docs.python.org/install/index.html , включая возможность добавления sys.path в каталог вашего уровня разработки на уровне пользователя, но на практике я обычно просто символически ссылаюсь мой локальный каталог разработки на сайт-пакеты – копирование его имеет тот же эффект.

    1) sys.path – это список.

    2) Проблема в том, что sys.path – это не ваш virtualenv.path, и вы хотите использовать pylint в своем virtualenv

    3) Так, как сказано, используйте init-hook (обратите внимание на «и», синтаксический анализ pylint является строгим)

     [Master] init-hook='sys.path = ["/path/myapps/bin/", "/path/to/myapps/lib/python3.3/site-packages/", ... many paths here])' 

    или

     [Master] init-hook='sys.path = list(); sys.path.append("/path/to/foo")' 

    .. а также

     pylint --rcfile /path/to/pylintrc /path/to/module.py 

    Я не знаю, как это работает с WingIDE, но для использования PyLint с Geany я установил внешнюю команду:

     PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f" 

    где% f – имя файла, а% d – путь. Может быть полезно кому-то 🙂

    Решение об изменении пути в init-hook хорошо, но мне не нравится тот факт, что мне пришлось добавлять абсолютный путь туда, поэтому я не могу поделиться этим файлом pylintrc среди разработчиков проекта. Это решение, использующее относительный путь к файлу pylintrc, работает лучше для меня:

     [MASTER] init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))" 

    Обратите внимание, что pylint.config.PYLINTRC также существует и имеет то же значение, что и find_pylintrc() .

    Один обходной путь, который я только что обнаружил, – это просто запустить PyLint для всего пакета, а не только одного файла. Так или иначе, ему удастся найти импортированный модуль.

    Мне пришлось обновить переменную PYTHONPATH системы, чтобы добавить мой путь к App Engine. В моем случае мне просто пришлось отредактировать файл ~/.bashrc и добавить следующую строку:

    export PYTHONPATH=$PYTHONPATH:/path/to/google_appengine_folder

    На самом деле, я сначала попытался установить init-hook но это не помогло решить проблему последовательно по моей базе кода (не уверен, почему). Как только я добавил его к системному пути (вероятно, хорошая идея в целом), мои проблемы исчезли.

    Может быть, вручную добавив каталог в PYTHONPATH?

     sys.path.append(dirname) 

    Пытаться

     if __name__ == '__main__': from [whatever the name of your package is] import one else: import one 

    Обратите внимание, что в Python 3 синтаксис для части в предложении else будет

     from .. import one 

    С другой стороны, это, вероятно, не решит вашу конкретную проблему. Я не понял этот вопрос и подумал, что two.py запускается в качестве основного модуля, но это не так. И учитывая различия в способе Python 2.6 (без импорта absolute_import из __future__ ) и импорта __future__ Python 3.x, в любом случае вам не нужно будет делать это для Python 2.6, я не думаю.

    Тем не менее, если вы в конечном итоге переключитесь на Python 3 и планируете использовать модуль как модуль пакета, так и как отдельный скрипт внутри пакета, может быть хорошей идеей сохранить что-то вроде

     if __name__ == '__main__': from [whatever the name of your package is] import one # assuming the package is in the current working directory or a subdirectory of PYTHONPATH else: from .. import one 

    в уме.

    EDIT: И теперь для возможного решения вашей реальной проблемы. Либо запустите PyLint из каталога, содержащего ваш one модуль (возможно, через командную строку), либо поместите следующий код где-нибудь при запуске PyLint:

     import os olddir = os.getcwd() os.chdir([path_of_directory_containing_module_one]) import one os.chdir(olddir) 

    В принципе, в качестве альтернативы возиться с PYTHONPATH, просто убедитесь, что текущий рабочий каталог – это каталог, содержащий one.py при импорте.

    (Глядя на ответ Брайана, вы, вероятно, могли бы назначить предыдущий код init_hook , но если вы это сделаете, вы можете просто сделать добавление к sys.path что он делает, что немного более элегантно, чем мое решение.)

    У меня была та же проблема, и поскольку я не мог найти ответ, я надеюсь, что это может помочь любому, у кого есть аналогичная проблема.

    Я использую flymake с epylint. В основном то, что я сделал, это добавить привязку в режиме ожидания, которая проверяет, является ли устаревшая директория каталогом пакетов python. Если я добавлю его в PYTHONPATH. В моем случае я считаю, что каталог является пакетом python, если он содержит файл с именем «setup.py».

     ;;;;;;;;;;;;;;;;; ;; PYTHON PATH ;; ;;;;;;;;;;;;;;;;; (defun python-expand-path () "Append a directory to the PYTHONPATH." (interactive (let ((string (read-directory-name "Python package directory: " nil 'my-history))) (setenv "PYTHONPATH" (concat (expand-file-name string) (getenv ":PYTHONPATH")))))) (defun pythonpath-dired-mode-hook () (let ((setup_py (concat default-directory "setup.py")) (directory (expand-file-name default-directory))) ;; (if (file-exists-p setup_py) (if (is-python-package-directory directory) (let ((pythonpath (concat (getenv "PYTHONPATH") ":" (expand-file-name directory)))) (setenv "PYTHONPATH" pythonpath) (message (concat "PYTHONPATH=" (getenv "PYTHONPATH"))))))) (defun is-python-package-directory (directory) (let ((setup_py (concat directory "setup.py"))) (file-exists-p setup_py))) (add-hook 'dired-mode-hook 'pythonpath-dired-mode-hook) 

    Надеюсь это поможет.

    Если кто-то ищет способ запустить pylint в качестве внешнего инструмента в PyCharm и работать с их виртуальными средами (почему я пришел к этому вопросу), вот как я его решил:

    1. В PyCharm> Настройки> Инструменты> Внешние инструменты, добавьте или отредактируйте элемент для pylint.
    2. В диалоговом окне «Параметры инструмента» в диалоговом окне «Редактировать инструмент» установите Программу для использования pylint из каталога интерпретатора python: $PyInterpreterDirectory$/pylint
    3. Задайте другие параметры в поле «Параметры», например: --rcfile=$ProjectFileDir$/pylintrc -rn $FileDir$
    4. Установите рабочий каталог в $FileDir$

    Теперь использование pylint в качестве внешнего инструмента будет запускать pylint в любом каталоге, который вы выбрали, используя общий файл конфигурации и использовать любой интерпретатор для вашего проекта (который предположительно является вашим интерпретатором virtualenv).

    Ключ состоит в том, чтобы добавить каталог проекта в sys.path без учета переменной env.

    Для тех, кто использует VSCode, вот однострочное решение для вас, если есть базовый каталог вашего проекта:

     [MASTER] init-hook='base_dir="my_spider"; import sys,os,re; _re=re.search(r".+\/" + base_dir, os.getcwd()); project_dir = _re.group() if _re else os.path.join(os.getcwd(), base_dir); sys.path.append(project_dir)' 

    Позвольте мне объяснить это немного:

    • re.search(r".+\/" + base_dir, os.getcwd()).group() : найти базовый каталог в соответствии с файлом редактирования

    • os.path.join(os.getcwd(), base_dir) : добавьте cwd в sys.path для соответствия среде командной строки


    FYI, вот мой .pylintrc:

    https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f

    У меня была такая же проблема, и я исправил ее, установив pylint в свой virtualenv, а затем добавив файл .pylintrc в каталог проекта со следующим в файле:

     [Master] init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")' 
    Python - лучший язык программирования в мире.