Импорт из параллельной папки

Столкнулся с проблемой импортов.

Структура моего проекта

Dir
|--package
|  |--subpackage
|     |--file.py
|--package2
   |--file2.py

Мне нужно импортировать код из file.py в file2.py. Как это сделать? На маке работает просто from package.subpackage.file import func

На винде нет. Мне нужно чтобы работало и на маке и на винде.

UPD

F:\programs\python\python.exe F:/programs/projects/R-D/ParsingWeb/pars_teams.py

Знакомые говорят проблема в этом но я не знаю как решить. В терминале пайчарма указано 2 пути, раньше был 1 и все работало нормально. Говорят проблема с PATH, как ее решить?

UPD оказалась какая-то проблема с дублированием файлов, пересоздал файл и решилось само собой. Но способ ниже рабочий


Ответы (2 шт):

Автор решения: roman147
import sys
import os

PACKAGE_PARENT = '..'
SCRIPT_DIR = os.path.dirname(
    os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))
)
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT)))

from package.subpackage.file import func


func()

Очень некрасивое решение, но должно работать в том числе на windows.

→ Ссылка
Автор решения: insolor

Согласно документации по sys.path:

sys.path

...

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter.

...

- при запуске интерпретатора в первый элемент списка sys.path попадает путь, где находится запускаемый файл (по вашей командной строке, это файл pars_teams.py, в sys.path будет добавлена директория F:/programs/projects/R-D/ParsingWeb). Поэтому интерпретатор автоматически будет видеть все пакеты, находящиеся в этой директории. Если "пусковой" файл находится внутри директории "Dir" на вашей схеме директорий, то все и так будет работать без дополнительных манипуляций.

Демонстрация:

C:\Users\user>tree Z:\Dir /f
Структура папок тома VBOX_Projects
Серийный номер тома: 0000-0801
Z:\DIR
│   pars_teams.py
│
├───package
│   └───subpackage
│           file.py
│
└───package2
        file2.py


C:\Users\user>python Z:\Dir\pars_teams.py
3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]
['Z:\\Dir', 'C:\\Python38\\python38.zip', 'C:\\Python38\\DLLs', 'C:\\Python38\\lib', 'C:\\Python38', 'C:\\Python38\\lib\\site-packages']
Z:\Dir\pars_teams.py
Z:\Dir\package\subpackage\file.py
Z:\Dir\package2\file2.py

Содержимое файлов:

  • pars_teams.py:

    import sys
    print(sys.version)
    print(sys.path)
    print(__file__)
    
    import package.subpackage.file
    
  • package\subpackage\file.py:

    print(__file__)
    
    import package2.file2
    
  • package2\file2.py:

    print(__file__)
    

Скриншот

→ Ссылка