#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» и нажмите «перезапустить языковой сервер»
Это должно разрешить весь импорт благодаря виртуальной среде.