Импорт файлов в одну папку из другой папки

#python

#python

Вопрос:

Я знаю, что задаются похожие вопросы, но то, что я нашел, мне не очень понятно в этой простой настройке. Учитывая это дерево каталогов, как я могу импортировать функцию из file1.py into file2 (мы вызываем интерпретатор из file2.py )? Я бы хотел, чтобы этот параметр работал независимо от того, где main_folder находится, то есть, если я скопирую main_folder в другой каталог, импорт все равно будет работать хорошо.

 main_folder
    folder1
        file1.py (with a function func())
    folder2
        file2.py
 

Комментарии:

1. Какой / где находится сценарий запуска, с помощью которого интерпретатор Python вызывается изначально?

2. Стартовый скрипт file2.py

3. Ответ, связанный SourceFileLoader с этим, должен дать вам то, что вы хотите, но в долгосрочной перспективе вы действительно должны научиться создавать и использовать пакеты.

4. Каким тогда было бы решение с использованием пакетов?

Ответ №1:

Вы можете использовать SourceFileLoader from importlib.machinery для импорта из пути.

Таким образом, вы можете использовать:

 # file2.py

from importlib.machinery import SourceFileLoader

PATH = "../folder1/file1.py"
file1 = SourceFileLoader("module.name", PATH).load_module()
 

Или, если вы хотите import из пакета, вы можете использовать:

 # file2.py

from folder1.file1 import func
 

Если вы хотите использовать пакетный подход, вам нужно будет запустить его из main_folder .

Ответ №2:

Также вы можете добавить абсолютный путь к sys.path .

sys.path

Список строк, который задает путь поиска для модулей. Инициализируется из переменной среды PYTHONPATH , плюс значение по умолчанию, зависящее от установки.

Как инициализируется при запуске программы, первым элементом этого списка, path[0] , является каталог, содержащий скрипт, который использовался для вызова интерпретатора Python. Если каталог скрипта недоступен (например, если интерпретатор вызывается интерактивно или сценарий считывается из стандартного ввода), path[0] это пустая строка, которая направляет Python сначала на поиск модулей в текущем каталоге. Обратите внимание, что каталог скрипта вставляется перед записями, вставленными в результате PYTHONPATH .

Программа может свободно изменять этот список для своих собственных целей. Следует добавлять только строки и байты sys.path ; все остальные типы данных игнорируются при импорте.

 import sys
from pathlib import Path
sys.path.append(str(Path(sys.path[0]).resolve().parent / "folder1"))
import file1