ImportError при выполнении тестов на Python - PullRequest
1 голос
/ 06 января 2020

У меня есть Python проект, который построен следующим образом:

├── process_folder
│   ├── tests
│   │   ├── __init__.py
│   │   ├── test_udf.py
│   │   └── test_process.py
│   ├── __init__.py
│   ├── process.py
│   └── udf.py

И process.py содержит from udf import *

Теперь, когда я запускаю test_udf.py, он успешно завершается - но когда я запускаю test_process.py, я получаю эту ошибку:

============================= test session starts =============================
platform win32 -- Python 3.7.3, pytest-5.1.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\Dev\Spark\process_folder\tests
test_process.py:None (test_process.py)
ImportError while importing test module 'C:\Dev\Spark\process_folder\tests\test_process.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test_process.py:5: in <module>
    from ..process import *
..\process.py:9: in <module>
    from udf import *
E   ModuleNotFoundError: No module named 'udf'
collected 0 items / 1 errors

=================================== ERRORS ====================================
__________________ ERROR collecting test_process.py __________________
ImportError while importing test module 'C:\Dev\Spark\process_folder\tests\test_process.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test_process.py:5: in <module>
    from ..process import *
..\process.py:9: in <module>
    from udf import *
E   ModuleNotFoundError: No module named 'udf'

Я не могу понять разницу между ними, и почему один работает, а другой нет (я думаю, что-то есть что касается папок, местоположений и того, откуда происходит мой импорт), я попробовал все виды решений, которые я нашел в Интернете (например, удалите файл __init__.py), но не смог запустить тесты.

Правка - для меня работал абсолютный импорт, теперь process.py содержит:

sys.path.insert(0, "./")
from udf import *

И теперь я могу запускать тесты локально, и тот же код выполняется на сервере без сбоев.

Спасибо!

1 Ответ

0 голосов
/ 06 января 2020

Вы можете полностью избежать такого рода ошибок, используя абсолютный импорт. Pep8 :

Рекомендуется абсолютный импорт, поскольку он обычно более читабелен и, как правило, ведет себя лучше (или, по крайней мере, дает лучшие сообщения об ошибках), если система импорта неправильно настроена (например, когда каталог внутри пакета попадает в sys.path):

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

...