#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