Модуль не найден при использовании pytest - PullRequest
0 голосов
/ 26 октября 2018

У меня есть virtualenv, который использует Python 3 и в настоящее время использует pytest для тестирования. Я упаковал программу с именем «process_expiring_passwords» и импортировал этот пакет из моего общего файла сценария с именем «pep.py». Я также использовал pip в своем virtualenv для установки моего пакета process_expiring_passwords.

Однако, когда я запускаю свои тесты, я получаю следующую ошибку:

ImportError при импорте тестового модуля «/home/username/projects/process-expiring-passwords/tests/test_process_expiring_passwords.py'.

Подсказка: убедитесь, что ваши тестовые модули / пакеты имеют правильные имена Python.

Traceback: tests / test_process_expiring_passwords.py: 3: в из process_expiring_passwords import ProcessExpiringPasswords process_expiring_passwords / process_expiring_passwords.py: 16: в from process_expiring_passwords.models.ProcessExpiringPasswordsLog

\ E ModuleNotFoundError: Модуль не указан 'process_expiring_passwords.models'; 'process_expiring_passwords' - это не пакет

Есть ли конкретная причина, по которой я могу использовать свой пакет из общего файла сценария pep.py, в то время как pytest не может найти указанный пакет?

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

pep.py:

from process_expiring_passwords.process_expiring_passwords \
    import ProcessExpiringPasswords

pep = ProcessExpiringPasswords()
pep.process()

process_expiring_passwords / process_expiring_passwords.py:

from process_expiring_passwords.models.ProcessExpiringPasswordsLog \
    import ProcessExpiringPasswordsLog

class ProcessExpiringPasswords:
    def __init__(self):
        self.example = 0
    def process():
        pepl = ProcessExpiringPasswordsLog()

process_expiring_passwords / модели / ProcessExpiringPasswordsLog.py:

class ProcessExpiringPasswordsLog():
    def __init__(self):
        self.example = 0

process_expiring_passwords / setup.py:

# ref: https://github.com/pypa/sampleproject/blob/master/setup.py
# ref: http://python-packaging.readthedocs.io/en/latest/minimal.html
from setuptools import setup

setup(
    name='process_expiring_passwords',
    version='0.0.1',
    packages=find_packages(),
    description='Process expiring passwords',
    license='MIT',
    install_requires=[
        'apiclient',
        'google-api-python-client',
        'httplib2',
        'mysqlclient',
        'oauth2client',
        'requests',
        'SQLAlchemy',
    ],
)

Тесты / test_process_expiring_passwords.py:

from process_expiring_passwords import ProcessExpiringPasswords

def test_pep():
    pep = ProcessExpiringPasswords()
    assert pep is not None

Структура проекта:

process_expiring_passwords
    pep.py
    process_expiring_passwords
        __init__.py
        models
            __init__.py
            ProcessExpiringPasswordsLog.py
        process_expiring_passwords.py
        setup.py
    tests
        test_process_expiring_passwords.py

Примечания:

  • Обновлен пример кода и setup.py на основе отзывов от Мэтта Мессерсмит.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

После расширенного разговора об этой проблеме, вот следующие шаги, которые особенно помогли на основе комментариев от @hoefling и после добавления packages=find_packages(), к setup.py на основе ответа от @Matt Messersmith:

  1. перемещено setup.py в корневую директорию проекта
  2. удалено __pycache__ файлов
  3. выполнено относительное импортирование в главном файле модуля

    process_expiring_passwords/process_expiring_passwords.py:

    from .models.ProcessExpiringPasswordsLog \ import ProcessExpiringPasswordsLog

  4. run python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

  5. удалена старая строка пакета из easy-install.pth (который должен быть найден с использованием результирующего пути из предыдущего шага)
  6. run pip install -e .
  7. добавлено process_expiring_passwords в раздел импорта файла теста:

    from process_expiring_passwords.process_expiring_passwords \ import ProcessExpiringPasswords

0 голосов
/ 26 октября 2018

Ваш код не совсем работает после публикации, я изменил его, чтобы в ваших конструкторах и функциях-членах было ключевое слово self. После этого я могу запустить pep.py.

Есть ли особая причина, по которой я могу использовать свой пакет из моего pep.py общий файл сценария, когда pytest не может найти указанный пакет?

Да, когда вы находитесь в каталоге process_expiring_passwords верхнего уровня, вы можете запустить pep.py, потому что вы получите "локальный" импорт пакета.

Тот факт, что тест не запускается, имеет мало общего с pytest, и в большей степени связан с тем, как выглядит ваш оператор импорта, и с тем фактом, что вы не собираете пакет:

from process_expiring_passwords import ProcessExpiringPasswords

Вы не создали пакет с именем process_expiring_passwords. Вы можете убедиться в этом, выполнив python setup.py bdist_wheel (или просто выполните sdist и распакуйте архив), разархивировав колесо и заметив, что пакетов нет.

Как правило, вам нужно установить пакеты python setup.py install (это приводит к распространению дистрибутива в ваших пакетах сайта), и вам также нужно назвать пакеты в setup.py (find_packages() ваш друг), а затем ваш тест должен работать (более или менее), как ожидалось.

НТН.

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