Исправление "Импорт [модуль] не может быть разрешен" в pyright
Я использую pyright для проверки типов, а также использую pytest для тестирования внутри кода Visual Studio. Структура папок для моих тестов должна иметь подпапку test в корне пакета. Например
|
MyPackage
|-- __init__.py
|-- MyModule.py
|--test
|-- __init__.py
|--MyModule_test.py
Я организую такие вещи, потому что будет много пакетов, и я хочу, чтобы все было организовано. Внутри pytest у меня есть
import pytest
import MyPackage.MyModule
...
Pytest может обнаруживать тесты и запускать их нормально, потому что у него есть особые возможности для настройки sys.path
(или что-то). Однако pyright просто пожалуется, что не может импортировать модуль,Import 'MyPackage.MyModule' could not be resolvedpyright (reportMissingImports)
. В этом есть смысл, но есть ли способ справиться с этим, либо в pyright, либо в настройках кода Visual Studio, чтобы это не жаловалось?
3 ответа
Вы можете добавить путь к библиотеке в переменную пути.
import sys
sys.path.insert(1, str('..'))
import MyModule
Чтобы Pylance мог правильно использовать вашу библиотеку (для автозаполнения ...), выполните следующие действия:
Pylance по умолчанию включает корневой путь вашего рабочего пространства. Если вы хотите включить другие подкаталоги в качестве путей разрешения импорта, вы можете добавить их, используя настройку для рабочей области.
- В VS Code нажмите +<,>, чтобы открыть настройки.
- Печатать
python.analysis.extraPaths
- Выберите «Добавить элемент».
- Введите путь к вашей библиотеке `.. '
Вы должны создатьpyrightconfig.json
файл или файл в корне вашего проекта. Например, если это проект Django, у вас должен быть один из тех файлов, гдеmanage.py
размещен. Затем установитеinclude
параметр и добавьте подкаталоги (или папки приложений в терминах Django).
Вы можете ознакомиться с этим образцом файла конфигурации . См. этот выпускной билет.
Например, если бы это была структура моего проекта:
├── manage.py
├── movie
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── moviereviews
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── pyproject.toml
мойpyproject.toml
было бы:
[tool.pyright]
include = ["movie", "moviereviews"]
Если вы работаете в виртуальной среде Python, установите venvPath и venv. Обратитесь к документации за исчерпывающим списком опций.
Хорошо, относительный импорт, как показано здесь, смог решить эту проблему. Так что в моем случае я должен был
# MyModule_test.py
import pytest
from .. import MyModule