首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >conftest.py ImportError:没有名为Foo的模块

conftest.py ImportError:没有名为Foo的模块
EN

Stack Overflow用户
提问于 2017-09-14 00:57:05
回答 2查看 8.2K关注 0票数 7

我有以下目录结构

代码语言:javascript
复制
/home/ubuntu/test/
 - Foo/
   - Foo.py
   - __init__.py
 - Test/
   - conftest.py
   - __init__.py
   - Foo/
     - test_Foo.py
     - __init__.py

Foo.py包含

代码语言:javascript
复制
class Foo(object):
  def __init__(self):
    pass

conftest.py包含:

代码语言:javascript
复制
import pytest

import sys
print sys.path

from Foo.Foo import Foo

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

test_Foo.py包含:

代码语言:javascript
复制
class TestFoo():
  def test___init__(self,foo):
    assert True

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

代码语言:javascript
复制
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中输出的测试似乎包含/home/ubuntu/ sys.path路径,所以它应该能够找到Foo.py,对吧?

问题是,只有当我将conftest.py移到下面的文件夹中时,它才能工作。

我运行pytest 3.2.2

EN

回答 2

Stack Overflow用户

发布于 2017-09-14 23:08:20

该错误指出由于ImportError而无法加载conftest.py。尝试将导入内容移动到foo fixture中,如下所示:

代码语言:javascript
复制
import pytest
import sys
print sys.path


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

Stack Overflow用户

发布于 2018-09-10 18:55:48

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

代码语言:javascript
复制
pip install virtualenv
virtualenv venv
. ./venv/bin/activate

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

代码语言:javascript
复制
from setuptools import setup

setup(
    name='foo',
    version='0.0.1',
    author='My Name',
    author_email='my.name@email.com',
    packages=['Foo'],
)

然后,您可以在虚拟环境中安装Foo模块:pip install -e .。然后,当你运行你的测试时,他们会选择你的模块。

要获得更完整、更长期的方法,请考虑使用需求文件。我通常将所需的模块放在名为requirements.txt (用于生产)和requirements-test.txt(用于运行测试)的两个文件中。所以在requirements.txt中放入你的Foo类需要的东西,例如

代码语言:javascript
复制
json
flask==1.0.2

其中指定了flask的版本,但没有指定json的版本。然后在requirements-test.txt文件中输入以下内容:

代码语言:javascript
复制
-r requirements.txt
pytest
-e .

第一行的意思是当你安装requirements-test.txt的时候,你也会得到所有的requirements.txt-e .是修复您在这里遇到的问题的魔法,即它安装Foo模块(以及您在此代码库中可能遇到的任何其他模块)。

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

代码语言:javascript
复制
pip install -r requirements-test.txt

现在你可以运行你的测试,它会找到你的Foo模块。这也是解决CI中问题的好方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46203090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档