运行 pytest 和 tox 时出现 ModuleNotFoundError
ModuleNotFoundError when running pytest and tox
我正在尝试为两个略有不同的目的构建模板包,它们可以在这里找到:
- https://github.com/martinlanton/tox_template_project
- https://github.com/martinlanton/maya_template_project
第一个是使用 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
我正在尝试为两个略有不同的目的构建模板包,它们可以在这里找到:
- https://github.com/martinlanton/tox_template_project
- https://github.com/martinlanton/maya_template_project
第一个是使用 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