使用pytest时在同一包中导入的ModuleNotFoundError

时间:2019-04-23 10:58:51

标签: python pytest

我的项目结构似乎是正确的。

setup.py
mypackage/
    __init__.py
    __main__.py
    main.py
    script1.py #import script2 
    script2.py
tests/
    test_script2.py

文件script1.py使用script2.py导入'import script2'

我可以使用以下命令运行代码而不会出现错误:

python mypackage
python mypackage/main.py

不幸的是,当我尝试使用pytestpython -m pytest执行测试时,我收到一个错误,提示没有名为script2的模块(以下完整消息)。我以可编辑模式pip install -e .

安装了程序包

我可以通过使用包名称为import mypackage.script2 as script2的导入来解决此问题,但是,所有克隆我的存储库的人都必须在运行pip之前安装包。否则将出现未找到mypackage的错误。

我希望能够在不安装pip的情况下运行此代码,并可以选择单独运行每个脚本文件。
您能建议我替代解决方案吗?

存储库:pytest-imports-demo

来自pytest的错误消息:

(venv) lecho:~/pytest-imports-demo$ pytest
================================================= test session starts ==================================================
platform linux -- Python 3.6.7, pytest-4.4.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/lecho/pytest-imports-demo
collected 0 items / 1 errors                                                                                           

======================================================== ERRORS ========================================================
________________________________________ ERROR collecting tests/test_script2.py ________________________________________
ImportError while importing test module '/home/lecho/pytest-imports-demo/tests/test_script2.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_script2.py:2: in <module>
    import mypackage.script1 as script1
mypackage/script1.py:1: in <module>
    import script2
E   ModuleNotFoundError: No module named 'script2'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=============================================== 1 error in 0.05 seconds ================================================

1 个答案:

答案 0 :(得分:1)

在文件pytest-imports-demo/mypackage/script1.py中导入script2程序包应执行以下任一操作:

from mypackage import script2

from . import script2

还需要向__init__.py目录添加空的pytest-imports-demo/tests/文件。

至于“我希望能够在不进行pip安装的情况下运行此代码,并可以选择分别运行每个脚本文件。”通过使脚本可执行并提供脚本的完整路径或将这些脚本的目录路径放入$ PATH环境变量中,可以完成此操作。另外,也可以通过pip安装来完成(但setup.py文件中需要其他设置)。

但是可以运行测试而无需pip install您的软件包。

我打开了PR:https://github.com/lecho/pytest-imports-demo/pull/1