关于python:conftest.py ImportError:没有名为Foo的模块

conftest.py ImportError: No module named Foo

我有以下目录结构

1
2
3
4
5
6
7
8
9
10
/home/ubuntu/test/
 - Foo/
   - Foo.py
   - __init__.py
 - Test/
   - conftest.py
   - __init__.py
   - Foo/
     - test_Foo.py
     - __init__.py

foo.py包含

1
2
3
class Foo(object):
  def __init__(self):
    pass

conftest.py包含:

1
2
3
4
5
6
7
8
9
10
import pytest

import sys
print sys.path

from Foo.Foo import Foo

@pytest.fixture(scope="session")
def foo():
  return Foo()

测试结果包含:

1
2
3
class TestFoo():
  def test___init__(self,foo):
    assert True

如果我运行pytest。在测试文件夹中,我得到一个错误,它找不到模块foo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Traceback (most recent call last):
  File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/_pytest/config.py", line 379, in _importconftest
    mod = conftestpath.pyimport()
  File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/py/_path/local.py", line 662, in pyimport
    __import__(modname)
  File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/_pytest/assertion/rewrite.py", line 212, in load_module
    py.builtin.exec_(co, mod.__dict__)
  File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/py/_builtin.py", line 221, in exec_
    exec2(obj, globals, locals)
  File"<string>", line 7, in exec2
  File"/home/ubuntu/test/Test/conftest.py", line 6, in <module>
    from Foo.Foo import Foo
ImportError: No module named Foo
ERROR: could not load /home/ubuntu/test/Test/conftest.py

在conftest.py中打印出来的sys.path似乎包含了/home/ubuntu/test路径,因此它应该能够找到foo.py,对吗?

问题是它只在我将conftest.py移动到下面的文件夹时才起作用。

我运行pytest 3.2.2


该错误表示由于ImportError,无法加载conftest.py。尝试在foo设备内移动导入,如下所示:

1
2
3
4
5
6
7
8
9
import pytest
import sys
print sys.path


@pytest.fixture(scope="session")
def foo():
    from Foo.Foo import Foo
    return Foo()


我建议您设置一个虚拟环境,并在虚拟环境中安装foo模块。

1
2
3
pip install virtualenv
virtualenv venv
. ./venv/bin/activate

要安装本地模块,需要一个setup.py文件:

1
2
3
4
5
6
7
8
9
from setuptools import setup

setup(
    name='foo',
    version='0.0.1',
    author='My Name',
    author_email='[email protected]',
    packages=['Foo'],
)

然后您可以在虚拟环境中安装foo模块:pip install -e .。然后,当您运行测试时,它们将接收您的模块。

为了更完整、更长期地做到这一点,请考虑使用需求文件。我通常把我需要的模块放在两个名为EDOCX1(用于生产)和EDOCX1(用于运行测试)的文件中。所以在requirements.txt中,把你需要的东西放在你的foo类中,例如

1
2
json
flask==1.0.2

其中指定了flask而不是json的版本。然后在requirements-test.txt文件中,您放入以下内容:

1
2
3
-r requirements.txt
pytest
-e .

第一行意味着当安装requirements-test.txt时,也可以获得所有requirements.txt-e .是修复您在这里遇到的问题的魔法,即安装foo模块(以及您在这个repo中可能遇到的任何其他模块)。

要安装requirements-test.txt文件,请运行:

1
pip install -r requirements-test.txt

现在您可以运行测试,它将找到您的foo模块。这也是解决CI问题的一个好方法。