Импорт из другого каталога не выполняется в Python - PullRequest
0 голосов
/ 05 октября 2019

Я прочитал, что для использования файла python в качестве модуля для импорта мне нужно поместить __init__.py в каталог.

У меня следующая структура каталогов:

data_load
    -- __init__.py
    -- rand_data.py

etc 
    -- __init__.py
    -- test.py

В test.py я импортирую класс, определенный в rand_data, и получаю ошибку:

python test.py 
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    from data_load.rand_data import RandData
ModuleNotFoundError: No module named 'data_load'

Ответы [ 2 ]

1 голос
/ 05 октября 2019

перейдите в родительский каталог etc и data_load и введите

python -m etc.test

. Это должно сработать.

Здесь небольшой тестовый пример (при условии, что вы работаете на машине с Linux)

## create the test case
mkdir -p import_issue/data_load import_issue/etc
touch import_issue/data_load/__init__.py import_issue/etc/__init__.py
echo 'print("I am", __name__)' > import_issue/etc/test.py
echo 'from data_load.rand_data import RandData' >> import_issue/etc/test.py
echo 'print("Randdata = ", RandData)' >> import_issue/etc/test.py
echo "class RandData:" > import_issue/data_load/rand_data.py
echo '    pass' >> import_issue/data_load/rand_data.py
#
# now perform the test
cd import_issue
python -m etc.test

Причина, по которой вещи в вашем первоначальном примере не сработали должным образом, заключается в том, что вы представляете рабочую директорию, вероятно, etc, и если вы загружаете скрипт на python в etc, он пытаетсяимпортировать load_data относительно текущего рабочего каталога (etc) и ниже etc нет каталога с именем rand_data, в котором есть файл __init__.py.

Мое предложение исправить это пойтидо общего родительского каталога (теперь это будет ваш текущий рабочий каталог) и импортируйте etc / test в качестве модуля. Причина в том, что test.py находится в каталоге и т. Д. С init .py, поэтому вы должны импортировать его как и т. Д., А не вызывать его напрямую. Вызывать файл, который является модулем напрямую из etc / test.py, не рекомендуется и может спровоцировать некоторые редкие запутанные ситуации.

0 голосов
/ 05 октября 2019

вместо запуска команды в etc каталоге python test.py запустите скрипт python в родительском каталоге etc и data_load.

, то есть то, что вам нужно сделать в терминале (учитывая, что вывсе еще в каталоге etc в терминале)

1.    `cd ..`
2.    `python etc/test.py`

это будет работать.

почему вы сталкиваетесь с ошибкой, потому что в test.py python ищет в текущем каталоге data_loadмодуль, и поскольку в каталоге etc отсутствует модуль data_load, он выдает эту ошибку.

как решить вышеуказанную проблему

  1. , добавьте sys.path в коде
  2. запустить скрипт из главной папки проекта, которая содержит весь пакет и модуль python и скрипты.
...