Импорт классов из другого пакета Python

#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, поэтому я изобрету свой собственный сверхсложный способ их использования»