Настройки VSCode для Pylance

#visual-studio-code #vscode-settings #pylance

#visual-studio-code #vscode-настройки #pylance

Вопрос:

Я запускаю Vscode со следующими компонентами:

 Version: 1.51.1 (user setup)
Commit: e5a624b788d92b8d34d1392e4c4d9789406efe8f
Date: 2020-11-10T23:34:32.027Z
Electron: 9.3.3
Chrome: 83.0.4103.122
Node.js: 12.14.1
V8: 8.3.110.13-electron.0
OS: Windows_NT x64 10.0.20270
Pylance 2.6
 

У меня следующая структура каталогов:

 src
    m1.py
    .vscode
        settings.json
    lib
        m2.py
        .vscode
        settings.json
 

Я использую несколько линтеров с этой средой при разработке кода на Python. Mypy не имеет проблемы, но pylance не может разрешить импорт.

Я пытаюсь импортировать модуль m2.py из m1.py when pylance сбой. Мой settings.json файл в src каталоге:

 {
    "python.autoComplete.extraPaths": [
        "*.lib"
    ]
}
 

Может кто-нибудь посмотреть, как решить эту проблему?

Комментарии:

1. в чем причина *. упоминания путей относительно корня рабочей области m1.py

2. @rioV8 Должны ли мои файлы содержаться в рабочей области Vscode?

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

4. @rioV8 Pythonpath будет хорош во время выполнения, но, похоже, pylance у него другое представление о package местоположении, чем Python .

5. PyLance необходимо использовать PYTHONPATH для поиска стандартных пакетов, если вы работаете со средой. Устанавливается PYTHONPATH в командной оболочке перед запуском VSC

Ответ №1:

Pylance использует python.analysis.extraPaths в отличие от python.autoComplete.extraPaths .

 {
    "python.analysis.extraPaths": [
        "*.lib"
    ]
}

 

Вы пробовали это?

Комментарии:

1. Недавно мы добавили быстрое исправление / действие с кодом, чтобы вы могли легко добавлять дополнительные пути, не возясь с пользовательским интерфейсом. Вы можете узнать больше об этом через devblogs.microsoft.com/python /…

Ответ №2:

Если ваша папка рабочей области VSCode является родительской src для папки, нормально иметь Pylance жалобу, потому что по умолчанию корнем вашего проекта является ваша папка рабочей области. Вы можете видеть, что если я импортирую src.lib.m2 Pylance , не жалуется, но это происходит, если я использую lib.m2 :

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

Поскольку у вас нет ошибки во время выполнения при запуске вашего кода, я бы сказал, что вы находитесь внутри src папки при запуске m1.py .

Если мои предположения неверны, вам нужно будет добавить больше деталей (пример кода, как запустить m1.py файл)

Ответ №3:

Настройте вложенные папки как надлежащие пакеты Python

Этот метод обеспечивает соответствие стандартным рекомендациям по упаковке проекта Python

Я рекомендую настройку, которая делает вложенные папки всеми надлежащими пакетами python. Для этого добавьте пустой __init__.py файл в каждую подпапку с модулями Python (т. Е. Файлами) в нем.

При первоначальной настройке игнорирование .vscode папок:

 src/
  __init__.py
  m1.py
  lib/
    __init__.py
    m2.py
 

В этом случае импорт должен быть выполнен из src папки (это будет считаться самим пакетом, поскольку __init__.py в нем есть файл):

 import src.m1
import src.lib.m2
 

Создайте правильные scripts пакеты

Однако я рекомендую помещать ваши скрипты в их собственный пакет, а не непосредственно в src папку:

 src/
  scripts/
    __init__.py
    m1.py
  lib/
    __init__.py
    m2.py
 

Это позволяет ссылаться на все ваши пакеты с правильным именем пакета, а не src как import scripts.m1 и import lib.m2 .

Дополнительные примечания

  • Если вы хотите, чтобы эти пакеты были «подпакетами», вы можете сохранить an __init__.py в папке src, чтобы сделать ее корневой папкой для всего.
  • С этим изменением импорт будет import src.scripts.m1 и import src.lib.m2 .
  • Python будет работать в родительских папках, пока не найдет папку без __init__.py файла, а затем запустит операторы импорта в цепочке из любых вложенных папок, которые являются пакетами (т. Е. Имеют __init__.py файл).
  • К любым папкам, объединенным в виде пакетов после этого процесса, можно получить доступ локально, не добавляя их в System или Python path.

Как импортировать модули из пакетов

В соответствии с этой схемой m1.py скрипт должен иметь возможность импортировать m2.py что-то вроде следующего. Поскольку src это не пакет, он является корневым с точки зрения Python и не включен в инструкции import.

 # In scripts.m1
import lib.m2 as m2

m2.function_1()
a = m2.function_2(m2.symbol_1)
 

или

 from lib.m2 import function_1, function_2, symbol_1

function_1()
a = function_2(symbol_1)
 

Если вы добавите тестовые файлы в эту настройку (скажем, в tests каталоге внутри scripts ), вы можете импортировать функции скрипта как import scripts.m1 as m1 или from script.m1 import * .

Эта настройка приводит пакет в соответствие со стандартом для пакетов python, и поэтому, если вы хотите сделать его устанавливаемым или загрузить в PyPI (или иным образом распространять его в частном порядке с zip-файлами или через репозиторий git), вы можете определить и создать проект с помощью пакета setuptools с использованием стандартного setup.py файла. См. раздел Упаковка проектов Python

Ответ №4:

Похоже, проблема в вашей файловой структуре, почему PyLance не может разрешить импорт. Лучший выход: создайте виртуальную среду python и активируйте ее.

Linux

 python -m venv env
source env/bin/activate
 

Windows powershell

 py -3.6 -m venv env
.envScriptsActivate
 

Заключительный шаг

После активации вашей виртуальной среды,

  • Просто нажмите ctrl shift p
  • найдите «python» и нажмите «перезапустить языковой сервер»

Это должно разрешить весь импорт благодаря виртуальной среде.