ModuleNotFoundError для импорта в одном пакете при использовании pytest - PullRequest
6 голосов
/ 23 апреля 2019

Структура моего проекта кажется правильной.

setup.py
mypackage/
    __init__.py
    __main__.py
    main.py
    script1.py #import script2 
    script2.py
tests/
    test_script2.py

Файл script1.py импортирует script2.py, используя 'import script2'.

Я могу запустить код без ошибок с помощью следующих команд:

python mypackage
python mypackage/main.py

К сожалению, когда я пытаюсь выполнить тесты, используя pytest или python -m pytest, я получаю сообщение об ошибке, что нет модуля с именем script2 (полное сообщение ниже). Я установил свой пакет в редактируемом режиме pip install -e .

Я могу это исправить, используя импорт с именем пакета, например import mypackage.script2 as script2, но каждый, кто клонирует мой репозиторий, должен будет установить пакет с pip перед его запуском. В противном случае возникнет ошибка, что mypackage не найден.

Я бы хотел иметь возможность запускать этот код без установки pip и иметь возможность запускать каждый файл сценария отдельно.
Не могли бы вы предложить мне альтернативное решение?

Репозиторий: pytest-import-demo

Сообщение об ошибке от pytest:

(venv) lecho:~/pytest-imports-demo$ pytest
================================================= test session starts ==================================================
platform linux -- Python 3.6.7, pytest-4.4.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/lecho/pytest-imports-demo
collected 0 items / 1 errors                                                                                           

======================================================== ERRORS ========================================================
________________________________________ ERROR collecting tests/test_script2.py ________________________________________
ImportError while importing test module '/home/lecho/pytest-imports-demo/tests/test_script2.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_script2.py:2: in <module>
    import mypackage.script1 as script1
mypackage/script1.py:1: in <module>
    import script2
E   ModuleNotFoundError: No module named 'script2'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=============================================== 1 error in 0.05 seconds ================================================

1 Ответ

1 голос
/ 25 мая 2019

В файле pytest-imports-demo/mypackage/script1.py импорт script2 пакета должен быть выполнен либо:

from mypackage import script2

или

from . import script2

Также необходимо добавить пустой __init__.py файл в pytest-imports-demo/tests/ directory.

Насколько я хотел бы иметь возможность запускать этот код без установки pip и иметь возможность запускать каждый файл сценария отдельно. "Это можно сделать, сделав сценарии исполняемыми и указав полный путь к сценариям или указав путь к каталогу с этими сценариями в переменной среды $ PATH.В качестве альтернативы это можно сделать через pip install (но в файле setup.py требуются дополнительные настройки).

Но тесты можно запускать без необходимости pip install вашего пакета.

Я открыл PR: https://github.com/lecho/pytest-imports-demo/pull/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...