Импорт модуля из подпакета не работает - PullRequest
0 голосов
/ 20 июня 2020

Моя файловая структура -

project/
    __init__.py
    features/
        __init__.py
        CompareText.py
    tests/
        test.py

в test.py Я пытаюсь импортировать CompareText

from project.features import CompareText

Я получаю сообщение об ошибке:

ModuleNotFoundError: No module named 'features'`

Я проверил документацию и считаю, что мой оператор импорта верен. Как исправить?

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

Добавьте файл __init__ в test. Каталог вашего проекта должен выглядеть так:

project/
    __init__.py
    features/
        __init__.py
        CompareText.py
    tests/
        __init__.py
        test.py

Тогда в project/tests/test.py будет работать следующий оператор импорта:

from ..features import CompareText

О, и это все равно вызовет ошибку, если вы попытаетесь чтобы запустить его напрямую. В вопросе, который вы сказали, вы пытались импортировать его следующим образом:

from project.features import CompareText

Это будет работать, только если родительский каталог project находится в пути поиска модуля Python. Итак, если вы хотите запускать тесты напрямую, измените путь поиска модуля по мере необходимости (см .: sys.path).

0 голосов
/ 20 июня 2020

Я полагаю, вы запускаете test.py как сценарий. test.py необходимо найти пакет project, и два способа сделать это: сделать ваш проект доступным для установки или взломать sys.path.

Installable

Первый немного измените структуру каталогов, чтобы проект стал подкаталогом какого-то анонимного каталога, который вы используете для разработки. Если вы проверяете этот материал в системе контроля версий, его нужно написать так, чтобы его можно было извлечь где угодно. Переместите tests на один каталог вниз.

mydevdir/
    setup.py
    project/
        __init__.py
        features/
            __init__.py
            CompareText.py
    tests/
        test.py

Как написать setup.py. Это может быть довольно сложно. Вы можете прочитать Сборка и распространение пакетов с помощью Setuptools и поискать другие ресурсы на net, но минималистичный setup.py -

#!/usr/bin/env python

from setuptools import setup, find_packages

setup(name='project',
      version='0.1',
      description='This is project: project',
      packages=find_packages(),
     )

Теперь, а в mydevdir do python setup.py develop. Или вы можете создать установочный пакет и поместить его в виртуальную среду для тестирования.

Взломать sys.path

Возможно, проще взломать пути в test.py. Обратите внимание, что это нужно будет отменить, если вы сделаете project устанавливаемым позже. Просто добавьте в начало test.py

import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).absolute().parents[2]))

. Это поместит родительский каталог по пути python, и теперь project будет найден при импорте. Существует риск, что файл .py в том же каталоге, что и project, может замаскировать установленный модуль. Если у вас есть местный csv.py, а у вас import csv, вы получите местный

0 голосов
/ 20 июня 2020

Предполагается, что ваш оператор импорта будет выглядеть так: (Но убедитесь, что ваш рабочий каталог совпадает с каталогом, в котором находится папка вашего проекта во время выполнения)

    from project.features import CompareText

Это должно работать, если ваш текущий путь во время выполнения скрипта имеет папку проекта

Если вы выполняете его внутри папки проекта, вы можете использовать:

    from .features import CompareText

Надеюсь, это поможет!

...