Импорт из параллельной папки
Столкнулся с проблемой импортов.
Структура моего проекта
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 шт):
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.
Согласно документации по 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.filepackage\subpackage\file.py:print(__file__) import package2.file2package2\file2.py:print(__file__)
