Не удается импортировать модуль из скрипта в те же / другие каталоги

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

Структура каталогов:

 .
├── classification
│   ├── lstm_repres.py
│   ├── lstm_test.py
│   ├── lstm_train.py
│   ├── lstm_utils.py
│   ├── lstm_utils.pyc
│   └── svm_run.py
├── utils
│   ├── data_splits.py
│   ├── evaluation.py
│   ├── load_data.py
│   ├── NLTKPreprocessor.py
│   ├── resources.py
│   ├── TfIdf.py
│   └── vector_utils.py
  

в lstm_train.py :

 from classification.lstm_utils import *
  

когда я пытаюсь запустить оба python2 lstm_train.py или python3 lstm_train.py , я получаю:

 Traceback (most recent call last):
  File "classification/lstm_train.py", line 7, in <module>
    from classification.lstm_utils import *
ModuleNotFoundError: No module named 'classification'
  

То же самое происходит в строке

 from utils.data_splits import get_train, get_val
  

В чем проблема? Почему формат from <dir>.<script> import * , похоже, здесь не работает?


Редактировать

Как было предложено @deathangel908, я добавил __init__.py пустые файлы в оба каталога, но ошибка сохраняется.

Ответ №1:

  • Чтобы пометить каталог как пакет, который вы хотите импортировать, в нем должно быть как минимум пусто __init__.py в этом каталоге. Поэтому добавьте __init__.py файлы в classification utils каталоги и.

  • Для импорта пакета с абсолютным путем вам необходимо запустить интерпретатор python из корневого пакета в качестве модуля: python3 -m "classification.lstm_train"

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

1. сделал это с touch __init__.py помощью, но я все равно получаю ту же ошибку. Должен ли я вызывать python2 classification/lstm_train.py или вызывать из одного и того же каталога?

2. Либо используйте относительный путь, либо настройте общедоступный

3. Пожалуйста, ознакомьтесь с моими изменениями и обновите свой вопрос относительным или общедоступным путем. Как вы это описываете, это не сработает.

4. попытка запуска из корневого каталога с python2/3 classification/lstm_train.py выдает ту же ошибку, а добавление .. перед строкой импорта и вызов изнутри classification каталога дают: from ..classification.lstm_utils import * ValueError: attempted relative import beyond top-level package