【问题标题】:ImportError: cannot import name when using pytestImportError:使用 pytest 时无法导入名称
【发布时间】:2023-04-05 06:35:01
【问题描述】:

我在python中创建了一个类似这样的目录结构:

module_root
├── __init__.py
├── module_a
│   ├── __init__.py
│   ├── local_module_a.py
│   └── tests
│       ├── context.py
│       └── test_local_module_a.py
├── module_b
│   └── tests
│       └── context.py
├── tests
│   ├── context.py
│   └── test_this_module_will_be_exported.py
├── this_module_will_be_exported.py
└── this_module_will_not_be_exported.py

每个模块都有自己的测试文件夹和他们的测试。一旦 Python 不在调用 import 的文件上方的目录中搜索模块,每个测试目录都会有一个名为 context.py 的文件,类似于:

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from this_module_will_be_exported import ThisClassWillBeExported

然后,在每个测试文件中,我使用以下导入语句:

from context import ThisClassWillBeExported

当我只有一个test 目录和一个context.py 时,一切正常,但是当我添加更多测试(如上面的目录树中所述)时,pytest 执行返回以下错误。

ImportError while importing test module 'path/to/module_root/tests/test_this_module_will_be_exported.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
module_root/tests/test_this_module_will_be_exported.py:1: in <module>
    from context import ThisClassWillBeExported
E   ImportError: cannot import name 'ThisClassWillBeExported'

当我将 module_root/module_a/tests/context.py 的名称更改为 module_root/module_a/tests/_context.py(例如)时,测试运行良好。所以我知道我可以简单地将所有 context.py 更改为不同的名称,但我想保留它们的名称以避免更多的工作。

所以我需要社区的帮助,有没有办法保留context.py 的名字并解决这个问题?

谢谢。 :)

【问题讨论】:

  • 这可能是因为您将同名的类导入到当前工作区。也许您应该尝试使用完整路径,例如;导入 module_a.tests.context 而不是从模块导入类。

标签: python unit-testing pytest


【解决方案1】:

首先,你只需要将根目录添加到PYTHONPATH,而不是所有的上下文文件。

其次,如果您想从同一文件夹导入上下文文件,请尝试使用相对路径。

from .context import ThisClassWillBeExported

第三,确保所有的上下文文件都有你要导入的变量。

【讨论】:

  • 我在运行脚本之前设置了 PYTHONPATH 并且它有效。感谢您的回答。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2018-11-08
  • 2018-07-03
  • 2016-03-31
  • 2013-04-24
  • 2014-01-08
  • 2016-03-23
相关资源
最近更新 更多