Почему код подмодуля пытается импортировать родственный подмодуль как напрямую, так и через относительный импорт? - PullRequest
1 голос
/ 13 апреля 2019

Я пишу скрипт, который будет выполняться из командной строки (добавив аргумент entry_points к setup.py).Моя структура каталогов выглядит следующим образом:

# Edit: package hasn't followed src packaging pattern, renamed to root_dir
root_dir/
    conftest.py
    setup.py
    module1/
        __init__.py
        script1.py
        script2.py
    module2/
        __init__.py
        other_script1.py
        other_script2.py
    tests/
        conftest.py
        some_tests/
            conftest.py
            test_some_parts.py
        some_other_tests/
            conftest.py
            test_these_other_parts.py

Edit: My setup.py имеет аргумент entry_points следующим образом:

    entry_points={
 'console_scripts': ['load_data = module1.script1:main']
},

В данный момент, на вершине script1.py Iиметь:

try:
    from script2 import func2
except ModuleNotFoundError:
    from .script2 import func2

Когда я устанавливаю пакет (pip install .) и запускаю load_data через командную строку, он хочет from script2 import func2.Но когда я запускаю тесты, он хочет from .script2 import func2.Я думаю, что это имеет значение, но я запускаю тесты, находясь в каталоге src/ (pytest tests/).

Этот нечетный try/except является полосой, которая позволяет мне запускать тесты и выполнять мой скрипт.Есть ли лучшее решение для этого или хотя бы объяснение?

1 Ответ

3 голосов
/ 13 апреля 2019

Это правильно:

from .script2 import func2

Удалите попытку / кроме хака.При правильно установленном пакете команда pytest не должна заботиться о том, в каком каталоге вы находитесь для разрешения импорта.Обратите внимание, что pytest добавит все каталоги, в которых обнаружены файлы conftest.py, к sys.path, что может маскировать или усугублять проблемы с упаковкой.

Это проблема с упаковкой. Вы 'неправильная компоновка src: setup.py должно быть вне корня src.Подкаталог tests должен находиться на том же уровне, что и src.Перечитайте это или это и попробуйте снова (и может быть целесообразно уничтожить / воссоздать venv).

Для пары примеров популярного проекта с открытым исходным кодомправильно структурируйте, используя макет src, извлеките attrs или cryptography .

И, наконец, не в последнюю очередь, не расстраивайтесь, если ошибаетесь.Упаковка Python - беспорядок, и это очень сложно сделать правильно.

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