繁体   English   中英

传递导入错误:ModuleNotFoundError:没有名为'...'的模块

[英]Transitive import error: ModuleNotFoundError: No module named '…'

我现在很困惑。 这是项目树:

project
- source
- - lib
- - - __init__.py
- - - utils.py
- - - stats.py
- test
- - lib
- - - test_stats.py

stats.pyimport utils ,如果执行stats.py本身,它确实有效。 现在test_stats.pyimport lib.stats但是导致ModuleNotFoundError: No module named 'utils'如果在project目录中作为PYTHONPATH=source pytest执行,则ModuleNotFoundError: No module named 'utils'错误:

==================================== ERRORS ====================================
___________________ ERROR collecting test/lib/test_stats.py ___________________
ImportError while importing test module '/lib/test_stats.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/lib/test_stats.py:40: in <module>
    import lib.stats
source/lib/__init__.py:42: in <module>
    from .stats import Stats
source/lib/stats.py:40: in <module>
    import utils
E   ModuleNotFoundError: No module named 'utils'
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.19 seconds ============================

发生了什么以及如何使用这样的目录结构正确执行测试?

PS我知道(开发模式) pip install ...tox技巧(用于模块搜索路径),但我想了解它们是否绝对有必要实现这一目标,或者我已经假设在这个简单的设置中出错了。

Python 3中的import utils是绝对导入的,Python在sys.path查找模块utils

当您将stats.py作为脚本运行stats.py ,Python将目录project/source/lib/sys.path 因此脚本中的import utils可以工作。

但是当你运行test_stats.py Python不会将project/source/lib/sys.path 所以import utils不起作用。

克服这种情况的一种方法是使用相对导入: from . import utils from . import utils stats.py它意味着:不要搜索sys.path ,从stats.py目录中导入模块utils 但是你失去了将stats.py作为脚本运行的能力。 因此,将主要代码从stats.py移动到lib/之外的单独脚本。

稍微不同的解决方案是将主代码从stats.py移动到模块__main__.py并使用python -m lib执行模块( project/source/必须在sys.path )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM