Я работаю над пакетом на Python. Я использую virtualenv. Я установил путь к корню модуля в пути .pth в моем virtualenv, чтобы я мог импортировать модули пакета при разработке кода и проводить тестирование (вопрос 1: это хороший способ?). Это отлично работает (вот пример, это то, что я хочу):
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py
issued command: echo hello
command output: hello
Однако, если я попытаюсь использовать PyTest, я получаю сообщения об ошибках импорта:
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile:
collected 0 items / 1 errors
================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
from rc import ns
E ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest
Я немного озадачен, похоже, это указывает на ошибку импорта, но Python справляется с этим нормально, так почему конкретно проблема с PyTest? Есть какие-нибудь предложения по поводу причины / решения (Вопрос 2)? Я погуглил и переполнил стек с ошибкой «ImportError: невозможно импортировать» для PyTest, но полученные мной совпадения были связаны с отсутствием пути Python и исправлением этого, что, похоже, не является проблемой здесь. Какие-либо предложения?
Я не могу сказать, что понимаю, почему это работает, но у меня была та же проблема, и тесты работают нормально, если я бегу
python -m pytest
.Я нахожусь в virtualenv, а pytest также доступен во всем мире:
источник
python -m pytest [...]
"также добавит текущий каталог вsys.path
".python3 -m pytest
PYTHONPATH=.:./src pytest
как цель make.Я просто решил это, удалив __init__.py в корне моего проекта:
источник
__init__.py file in a folder containing TESTS
не решил мою проблему. Этот сработал. Думаю, это из-за иерархии файлов.__init__.py
файл. Я все еще сталкивался с проблемой. Добавление файла conftest.py в корневой каталог сработало для меня.У меня была такая же проблема, но по другой причине, чем упомянутые:
У меня был установлен py.test глобально, а пакеты были установлены в виртуальной среде.
Решение было установить
pytest
в виртуальной среде. (В случае, если ваша оболочка хеширует исполняемые файлы, как это делает Bash, используйтеhash -r
или используйте полный путь кpy.test
)источник
pytest
virtualenv, созданныйconda
, ноpytest
он доступен в корневой среде anaconda. Поэтому pytest может быть найден, но не любой пакет , установленный в среде.pip3 install pytest
внутри virtualenv исправлена проблема.Эта проблема может возникнуть, если у вас есть
tests.py
файл и папка тестов сtests/__init__.py
.Во время сбора pytest находит папку, но когда он пытается импортировать тестовые файлы из папки,
tests.py
файл вызывает проблему импорта.Чтобы исправить, просто удалите
tests.py
файл и поместите все свои тесты вtests/
папку.Для вашего конкретного случая исправление будет именно таким:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
присутствуетисточник
У меня была аналогичная проблема, точно такая же ошибка, но по другой причине. Я отлично запускал тестовый код, но со старой версией модуля. В предыдущей версии моего кода один класс существовал, а другой - нет. После обновления кода я должен был запустить следующее, чтобы установить его.
sudo pip install ./ --upgrade
После установки обновленного модуля запуск pytest дал правильные результаты (потому что я использовал правильную кодовую базу).
источник
pip install ./ --upgrade
обновил установленную версию библиотеки последним кодом и позволил pytest найти и эту последнюю версию.Установите пакеты в вашу виртуальную среду.
Затем запустите новую оболочку и снова создайте свою виртуальную среду.
источник
В моем случае ошибка импорта произошла из-за того, что пакет указывает на другой пакет / каталог с тем же именем, а его путь находится на один уровень выше папки, которую я действительно хотел. Я думаю, это также объясняет, почему некоторым людям нужно удалить _ init _.py, а другим нужно добавить обратно.
Я просто поставил
print(the_root_package.__path__)
(послеimport the_root_package
) как вpython
консоли, так и вpytest
скриптах, чтобы сравнить разницуИТОГ: В
python
этом случае пакет, который вы импортируете, может отличаться от пакета при запускеpytest
.источник
Ответ выше не работает для меня. Я просто решил это, добавив абсолютный путь модуля, который не найден,
sys.path
вверхуtest_xxx.py
(вашего тестового модуля), например:источник
test_main.py
, я поместил ееconftest.py
в свой тестовый каталог, и он сработал. Спасибо за программное решение вместо файлового мусора.Если это связано с кодом Python, который изначально был разработан в Python 2.7, а теперь перенесен в Python 3.x, то проблема, вероятно, связана с проблемой импорта.
например, при импорте объекта из файла:
base
который находится в том же каталоге, это будет работать в python 2.x:в python 3.x вы должны заменить
base
полный путь, иначе.base
это вызовет указанную выше проблему. поэтому постарайтесь:источник
Сегодня я столкнулся с этой проблемой и решил ее, позвонив
python -m pytest
из корневого каталога моего проекта.Звонки
pytest
из того же места по-прежнему вызывали проблемы.Мой каталог проекта организован как:
Модуль
routes
был импортирован у меняtest_routes.py
как:from server.routes.routes import Routes
Надеюсь, это поможет!
источник
Была аналогичная проблема, и она сработала, когда я добавил
__init__.py
файл в каталог тестов.источник
Другой частный случай:
У меня возникла проблема с использованием tox. Итак, моя программа работала нормально, но юнит-тесты через tox продолжали жаловаться. После установки пакетов (необходимых для программы) вам необходимо дополнительно указать пакеты, используемые в unittests, в файле tox.ini
источник
Я получал это с помощью VSCode. У меня среда conda. Я не думаю, что расширение Python VScode могло видеть обновления, которые я делал.
Мне пришлось бежать
pip install ./ --upgrade
источник
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Отредактируйте свой conftest.py и добавьте следующие строки кода:
И если вы пытаетесь запустить тестовый пример через терминал, используйте следующий пример:
источник
NameError: name 'file' is not defined
- чему должен равняться файл?Еще одна крупная победа для системы импорта Python. Я думаю, причина отсутствия консенсуса в том, что то, что работает, вероятно, зависит от вашей среды и инструментов, которые вы используете поверх нее.
Я использую это из VS Code в обозревателе тестов под Windows в среде conda, Python 3.8.
Настройка, с которой мне нужно работать:
При этой настройке работает intellisense и обнаружение тестов.
Обратите внимание, что я изначально пробовал следующее, как рекомендовано здесь .
Я не мог найти способ заставить это работать из VS Code, потому что
src
папка просто взорвала разум системы импорта. Я могу представить, что есть способ заставить это работать из командной строки. Поскольку я относительно недавно начал программировать на Python, он вызывает у меня ностальгическое чувство работы с COM, но это немного менее увлекательно.источник
Мои 2 цента на это: pytest может потерпеть неудачу, если вы не используете виртуальные среды. Иногда это просто работает, иногда нет.
Следовательно, решение:
Код, использующий Windows PowerShell:
Тогда наконец
Пример setup.py для pip install -e:
источник
Я не согласен с сообщениями о том, что вы должны удалить любые
__init__.py
файлы. Вместо этого вы должны изменить файлsys.path
.Проведите эксперимент, при котором вы печатаете
sys.path
при обычном выполнении кода. Затем распечатайтеsys.path
при запуске кода через pytest. Я думаю, вы обнаружите разницу между этими двумя путями, поэтому pytest ломается.Чтобы исправить это, вставьте путь из первого эксперимента в 0-й индекс второго.
Позвольте
'/usr/exampleUser/Documents/foo'
быть первым элементомprint(sys.path)
для эксперимента 1.Ниже приведен код, который должен исправить вашу проблему:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Поместите это в начало файла перед фактическим оператором импорта.
Источник: Я сам имел дело с этим, и описанный выше процесс решил это.
источник
Оставил все так же и просто добавил пустой тестовый файл в корневую папку .. Решил
Вот результаты, эта проблема меня какое-то время действительно беспокоила. Моя структура папок была
и pytest будет жаловаться на ModuleNotFoundError и дает СОВЕТ - убедитесь, что ваши тестовые модули / пакеты имеют допустимые имена Python.
Я представил файл фиктивного теста на том же уровне, что и каталог mathsapp и tests. В файле ничего не было. Теперь pytest не жалуется.
Результат без файла
Результаты с файлом
источник
Я решил свою проблему, установив
PYTHONPATH
переменные среды для конкретной конфигурации, с которой я запускаю свои тесты.Пока вы просматриваете тестовый файл в PyCharm:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
разделе Среда> Переменные среды.источник
Просто поместите пустой
conftest.py
файл в корневой каталог проекта, потому что, когдаpytest
обнаруживает conftest.py, он изменяет sys.path, чтобы он мог импортировать данные изconftest
модуля. Общая структура каталогов может быть:источник
В моем случае я работаю в контейнере, и, к сожалению, pytest имеет тенденцию использовать python2.7, а не мой предпочтительный интерпретатор python3.
В моем случае это сработало:
Моя структура папок
источник
Возможно, Pytest не читает пакет как модуль Python, в то время как Python читает (вероятно, из-за проблем с путями). Попробуйте изменить каталог скрипта pytest или явно добавить модуль в свой PYTHONPATH.
Или может случиться так, что на вашем компьютере установлены две версии Python. Проверьте исходный код Python на наличие pytest и запускаемую оболочку python. Если они разные (например, Python 2 и 3), используйте,
source activate
чтобы убедиться, что вы запускаете pytest, установленный для того же питона, на котором установлен модуль.источник
Для тех, кто пробовал все и все еще получает ошибку, у меня есть работа.
В папке, где установлен pytest , перейдите в pytest-env .
Откройте pyvenv.cfg файл .
В файле измените include-system-site-packages с false на true .
Надеюсь, это сработает. Не забудьте проголосовать за.
источник
Если у вас уже есть файлы .pyc, попробуйте их удалить.
Сегодня я столкнулся с этой проблемой, вот что случилось:
сначала я запускаю pytest в mac (это сгенерирует файлы pyc), затем я запускаю контейнер докеров (ОС - alpine) с установленным каталогом проекта, а затем, когда я пытаюсь запустить pytest в контейнере, происходит ImportError. после очистки всех файлов pyc ошибок больше нет.
Надеюсь, это может быть полезно.
источник
Если вам нужен файл init .py в вашей папке, сделайте копию папки и удалите в ней init .py, чтобы запустить ваши тесты, он работает для локальных проектов. Если вам нужно регулярно запускать тест, посмотрите, можете ли вы переместить свой init .py в отдельный файл.
источник
[Решено] Прежде чем перейти непосредственно к решению удаления / добавления
__init__.py
, мы также можем захотеть посмотреть, как выполняется импорт в ваших классах. На самом деле, я потерял день, играя, просто__init__.py
думая, что это может быть проблемой :) Однако это было довольно информативно.В моем случае это был неправильный способ вызова классов из одного класса Python в другой класс Python, который выбрасывал
ImportError
. Исправлен способ вызова классов / модулей, и это работало как шарм. Надеюсь, это поможет и другим.И да, для подобной ошибки у нас могут быть разные решения в зависимости от того, как написан код. Лучше потратить больше времени на самостоятельную отладку. Полученный урок :) Удачного кодирования !!!
источник
Я поместил все свои тесты в папку с тестами и получал ту же ошибку. Я решил это, добавив init .py в эту папку следующим образом:
источник