Исправление "Импорт [модуль] не может быть разрешен" в 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 по умолчанию включает корневой путь вашего рабочего пространства. Если вы хотите включить другие подкаталоги в качестве путей разрешения импорта, вы можете добавить их, используя настройку для рабочей области.

  1. В VS Code нажмите +<,>, чтобы открыть настройки.
  2. Печатать python.analysis.extraPaths
  3. Выберите «Добавить элемент».
  4. Введите путь к вашей библиотеке `.. '

Вы должны создать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
Другие вопросы по тегам