Py.test не находит модуль

Этот вопрос связан со следующими вопросами, но на него нет ответа:

У меня есть модуль python со следующей древовидной структурой:

mcts
|- setup.py
|- mcts
 |- __init__.py
 |- uct.py
 |- toy_world_state.py
 |- test
  |- test_uct.py
  |- test_toy_world_state.py

Я создаю virtualenv в каком-то каталоге

$ mkdir virtual
$ virtualenv --system-site-packages virtual
$ source virtual/bin/activate

Затем я устанавливаю свой пакет:

$ cd /path/to/mcts
$ pip install -e .

Теперь я пытаюсь запустить тесты:

$ py.test mcts
================================================== test session starts ==================================================
platform linux -- Python 3.4.2 -- py-1.4.26 -- pytest-2.6.4
collected 0 items / 2 errors 

======================================================== ERRORS =========================================================
__________________________________ ERROR collecting mcts/test/test_toy_world_state.py ___________________________________
mcts/test/test_toy_world_state.py:4: in <module>
    from mcts.toy_world_state import *
E   ImportError: No module named 'mcts'
________________________________________ ERROR collecting mcts/test/test_uct.py _________________________________________
mcts/test/test_uct.py:4: in <module>
    from mcts.uct import *
E   ImportError: No module named 'mcts'
================================================ 2 error in 0.02 seconds ===============================================

Если я перехожу на любой путь и пытаюсь импортировать модуль в ipython, он работает:

$ cd
$ ipython

In [1]: import mcts.uct

In [2]: mcts.uct? 
Type:        module
String form: <module 'mcts.uct' from '/home/johannes/src/mcts/mcts/uct.py'>
File:        /home/johannes/src/mcts/mcts/uct.py
Docstring:   <no docstring>

Если я запускаю pytest изнутри pycharm, он работает. (Но я не знаю, что происходит в пичарме...)

Пока echo $PYTHONPATH возвращает пустую строку, sys.path выглядит правильно:

>>> import sys; print(sys.path)
['/home/johannes/src/mcts/virtualenvs/teste/lib/python3.4/site-packages', 
'/home/johannes/src/mcts', '', '/usr/bin', 
'/usr/lib/python3.4/site-packages/GitPython-0.3.2.RC1-py3.4.egg', 
'/usr/lib/python34.zip', '/usr/lib/python3.4', 
'/usr/lib/python3.4/plat-linux', '/usr/lib/python3.4/lib-dynload', 
'/usr/lib/python3.4/site-packages', 
'/usr/lib/python3.4/site-packages/IPython/extensions', 
'/home/johannes/.ipython']

Что мне нужно сделать, чтобы запустить pytests?

Ответ 1

Я исправил это сам. По какой-то причине pytest не получил virtualenv правильно. Установка pytest в virtualenv решила его
source virtualenvs/teste/bin/activate
pip install pytest

Ответ 2

Я создал это как ответ на ваш вопрос и свое собственное замешательство. Я надеюсь, что это помогает. Обратите внимание на PYTHONPATH как в командной строке py.test, так и в tox.ini.

https://github.com/jeffmacdonald/pytest_test

В частности: вы должны указать py.test и tox, где вы найдете модули, которые вы включаете.

С помощью py.test вы можете сделать это:

PYTHONPATH=. py.test

И с помощью токсичности добавьте это в ваш tox.ini:

[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
    PYTHONPATH = {toxinidir}

Ответ 3

В сообщении об ошибке говорится:

ImportError: нет модуля с именем 'mcts'

Посмотрев на структуру каталогов, которую вы указали, эта ошибка сообщает вам, что у вас нет модуля/пакета 'mcts'. Чтобы исправить это, вам нужно добавить файл "__init__.py" в каталог "mcts". Впоследствии вы можете запустить "py.test" без других параметров/настроек.