Как бороться с относительным импортом в Python с помощью IntelliJ - PullRequest
0 голосов
/ 19 сентября 2018

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

У меня есть каталог, подобный следующему

package
├── init .py.
├── subpackage1
│ ├── init .py
│ ├── moduleX.py
├── subpackage2
│ ├── init .py
│ ├── moduleY.py

В moduleY Я хочу импортировать moduleX с использованием относительного синтаксиса импорта: from ..subpackage1 import moduleX

иполучено следующее сообщение об ошибке:

попытка относительного импорта за пределы пакета верхнего уровня

Я знаю, что это можно решить, изменив рабочий каталог на вершину "пакета"и набрав python -m package.subpackage2.moduleY в консоли.

Но как я могу это сделать в IntelliJ?

1 Ответ

0 голосов
/ 19 сентября 2018

Должно работать следующее:

import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
from subPackage1 import fileInSubPackage1

Также есть очень хорошее объяснение того, как обращаться с импортом, которое можно найти здесь

ОБНОВЛЕНИЕ:

Изучив официальную документацию, я понял, что причина относительного сбоя при импорте выше заключается в том, что при использовании from something import somefile что-то должно быть пакетом или несколькими пакетами.Ниже картинка прояснит это далее:

given this project structure

, если у нас есть вышеупомянутая структура проекта, и мы хотим импортировать the_program.py в file_random.py, мы должнынапишите from directory_one.package_inside_directory_one import the_program directory_one и package_inside_directory оба являются пакетами.и from ..package_two_inside_directory_one import the_program приведет к ValueError: attempted relative import beyond top-level package

Теперь, если структура расширена ниже:

project structure extended

и мы 'находясь в the_program.py и хотим импортировать file_under_Subdirectory.py и more_tests.py, мы просто следуем одному и тому же правилу:

from directory_two.package_inside_directory_two import more_tests
from directory_two.package_inside_directory_two.subDirectory_inside_package_two import file_under_Subdirectory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...