运行 pytest 和 tox 时出现 ModuleNotFoundError

ModuleNotFoundError when running pytest and tox

我正在尝试为两个略有不同的目的构建模板包,它们可以在这里找到:

第一个是使用 tox/pytest/setup.py 的通用模板项目,效果很好。 然而,第二个是出于相同的目的,但在使用 Autodesk Maya 提供的解释器进行测试时。

我的问题来自第二个。 当 运行 使用 tox 命令进行测试时,出现此错误:

______________________________________________________________________________________________________________ ERROR collecting tests/test_maya_test_setup.py ______________________________________________________________________________________________________________ 
ImportError while importing test module 'D:\python\maya_template_project\tests\test_maya_test_setup.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
C:\Program Files\Autodesk\Maya2022\Python37\lib\importlib\__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests\test_maya_test_setup.py:4: in <module>
    from one.module_one import create_sphere
E   ModuleNotFoundError: No module named 'one'
========================================================================================================================= short test summary info ========================================================================================================================== 
ERROR tests/test_maya_test_setup.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
============================================================================================================================= 1 error in 0.13s ============================================================================================================================= 
ERROR: InvocationError for command 'C:\Program' 'Files\Autodesk\Maya2022\bin\mayapy' -m pytest (exited with code 2)
_________________________________________________________________________________________________________________________________ summary __________________________________________________________________________________________________________________________________
ERROR:   maya2022: commands failed

这是我的 tox.ini 的内容:

[tox]
envlist = maya2022
skipdist = True

[testenv:maya2022]
passenv = PYTHONPATH

deps = -rrequirements.txt

commands =
    C:\Program Files\Autodesk\Maya2022\bin\mayapy -m pytest
setenv =
    IN_MAYA = 1

据我了解,这似乎来自 conftest.py 的位置,这迫使 tox 将 conftest 文件的位置添加到 sys.path。

我曾尝试删除几个线程中提到的 skipdist,但这对结果没有任何影响(无论如何我怀疑,因为下面提到的解决方法)。

这意味着如果我将 this line 更新为 from src.one.module_one import create_sphere,这将解决问题并正常工作。 然而,这是非常不可取的,因为我不希望 src 包可导入,但更重要的是,我希望 one 包可直接导入,因为这是最合乎逻辑的事情,还因为这是 this article.

中解释的预期行为

所以我的问题是:如何解决这个问题并使我的项目正常运行,而无需将 src 包添加到我的导入中?

tox 不关心 conftest.py,因为这是 configuration/collection 文件 pytest 个灯具。

在 tox.ini 文件中添加或删除 skipdist 没有任何区别,因为这不是有效的 tox 设置。我想你的意思是 skipsdist,参见 https://tox.wiki/en/latest/config.html

您可能想删除 src 目录中的 __init__.py - 这是一个只有您的项目源的文件夹,即一个文件夹。 src 不应该是可导入的。

您设置的具体问题是,您使用 tox 安装项目,但随后使用无法访问已安装包的 Python 解释器 (C:\Program Files\Autodesk\Maya2022\bin\mayapy) - 这就是为什么你得到 ModuleNotFoundError.

from src.one.module_one import create_sphere 起作用的原因 - 至少有一点 - 是您将 pytest 作为模块调用。

python -m pytest 使 pytest 添加当前目录到 sys 路径,参见 https://jugmac00.github.io/til/what-is-the-difference-between-invoking-pytest-and-python-m-pytest/

那么,如何解决这个问题?

一般来说,据我所知,tox 不适用于自定义解释器。

也许您可以通过将 one 目录添加到路径来操纵 sys.path 来解决这个问题,然后您的自定义解释器就可以使用该目录。

这意味着您的项目需要在不安装的情况下运行,并且需要从“外部”发现测试 pytest

我无法确定这些变通办法是否有用并适合您,因为我不熟悉 Maya,但我是 tox 开发人员之一,您所做的绝对不是“主流”:- )

P.S.: 你也可以使用 install_command 来安装你的包,而不是使用 tox 环境中的 pip,而是使用 pip玛雅,见 https://tox.wiki/en/latest/config.html#conf-install_command and https://knowledge.autodesk.com/support/maya/downloads/caas/CloudHelp/cloudhelp/2022/ENU/Maya-Scripting/files/GUID-72A245EC-CDB4-46AB-BEE0-4BBBF9791627-htm.html