#python #python-3.x #python-import
#python #python-3.x #python-импорт
Вопрос:
Мой каталог исходного кода (именованный my_dir
) организован следующим образом:
my_dir
|
|-- pkg_1
| |
| |-- module_1.py
| |-- module_2.py
|
|-- src.py
В module_1.py
я импортирую module_2.py
с помощью
import module_2
Но когда я импортирую module_1
в src.py
с помощью
import module_1
Возникает ошибка, поскольку инструкция import module_2
в module_1.py
действует так, как будто мой рабочий каталог pkg_1
вместо my_dir
.
Как это можно исправить?
Ответ №1:
в module_1.py
импортируйте его как from . import module_2
и в src.py
импортируйте module_1 как from pkg_1 import module_1
Комментарии:
1. В соответствии с этим подходом мне нужно изменить все инструкции import в
pkg_1
и, возможно, это неосуществимо. Моя ситуация такова, что я загрузил репозиторий из git и хочу использовать его как модуль всего моего проекта. У вас есть какие-либо другие идеи?2. затем в pkg_1 запишите файл init .py и в этом файле укажите,
from . import module_1
аfrom . import module_2
затем изsrc.py
вы можете импортировать его какfrom pkg_1 import module_1
3. @HOANGGIANG Правильно изменить весь код, если вы хотите, чтобы весь код вел себя по-другому. Вы срезаете путь через лес и жалуетесь, что на нем нет дороги.
Ответ №2:
Это является причиной недопонимания:
Возникает ошибка, поскольку инструкция
import module_2
вmodule_1.py
действует так, как будто мой рабочий каталогpkg_1
вместоmy_dir
.
Прежде всего, когда вы импортируете пакет, код в этом пакете не выполняется в другом рабочем каталоге.
Вторая ошибка заключается в том, что рабочий каталог вообще не имеет значения, даже если он действительно изменился.
Код Python организован в пакеты и модули. Интерпретатор выполняет поиск пакетов и модулей по пути python.
В показанной структуре они my_dir
будут находиться в python path, если вы запустите python src.py
. Тогда pkg_1
это пакет, тогда как module_1
и module_2
являются модулями. Самый простой способ импортировать module_2
— использовать абсолютный импорт:
import pkg_1.module_2
В качестве альтернативы, из другого модуля в pkg_1
вы можете использовать относительный импорт:
from . import module_2
Ответ №3:
Попробуйте это:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys;
# get path to this file.
path_this_file = os.path.dirname(os.path.abspath(__file__));
# add path to import files.
sys.path.insert(0, path_this_file "/pkg_1");
import module_1, module_2;
Комментарии:
1. Это то, чего вам определенно не следует делать! Это просто «Я не понимаю, как правильно используется импорт Python, поэтому я изобрету свой собственный сверхсложный способ их использования»