简体   繁体   English

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

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

I'm confused now. 我现在很困惑。 Here is the project tree: 这是项目树:

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

stats.py has import utils , which indeed works if one executes stats.py itself. stats.pyimport utils ,如果执行stats.py本身,它确实有效。 Now test_stats.py has import lib.stats but that results in the ModuleNotFoundError: No module named 'utils' error if executed as PYTHONPATH=source pytest in the project directory: 现在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 ============================

What's going on and how to properly execute tests with such directory structure? 发生了什么以及如何使用这样的目录结构正确执行测试?

PS I'm aware of (development mode) pip install ... and tox tricks (for module search path), but I would like to understand whether they are absolutely necessary to get this going or I already assume something wrong in this simple setup. PS我知道(开发模式) pip install ...tox技巧(用于模块搜索路径),但我想了解它们是否绝对有必要实现这一目标,或者我已经假设在这个简单的设置中出错了。

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

When you run stats.py as a script Python adds the directory project/source/lib/ to sys.path . 当您将stats.py作为脚本运行stats.py ,Python将目录project/source/lib/sys.path So import utils in the script works. 因此脚本中的import utils可以工作。

But when you run test_stats.py Python doesn't add project/source/lib/ to sys.path . 但是当你运行test_stats.py Python不会将project/source/lib/sys.path So import utils doesn't work. 所以import utils不起作用。

A way to overcome that is to use relative import: from . import utils 克服这种情况的一种方法是使用相对导入: from . import utils from . import utils . from . import utils In stats.py it means: do not search sys.path , import module utils from the same directory as stats.py . stats.py它意味着:不要搜索sys.path ,从stats.py目录中导入模块utils But then you loose ability to run stats.py as a script. 但是你失去了将stats.py作为脚本运行的能力。 So move main code from stats.py to a separate script outside of lib/ . 因此,将主要代码从stats.py移动到lib/之外的单独脚本。

A slightly different solution is to move main code from stats.py to module __main__.py and execute the module using python -m lib ( project/source/ must be in sys.path ). 稍微不同的解决方案是将主代码从stats.py移动到模块__main__.py并使用python -m lib执行模块( project/source/必须在sys.path )。

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

相关问题 导入错误-ModuleNotFoundError:没有名为“模型”的模块 - Import error - ModuleNotFoundError: No module named 'model' 导入模块:ModuleNotFoundError:没有模块命名 - Import Module : ModuleNotFoundError: No module named Scrapy ModuleNotFoundError:没有名为“import”的模块 - Scrapy ModuleNotFoundError: No module named "import" Python导入错误ModuleNotFoundError:停电后没有名为“ _ctypes”的模块 - Python import error ModuleNotFoundError: No module named '_ctypes', after power outage 导入 Porter 错误 ModuleNotFoundError: No module named 'sklearn.tree.tree' - import Porter error ModuleNotFoundError: No module named 'sklearn.tree.tree' ModuleNotFoundError:在 vs 代码 python 中没有名为导入错误的模块 - ModuleNotFoundError: No module named import error in vs-code python ModuleNotFoundError:没有名为“tensorflow.python.platform”的模块导入错误 - ModuleNotFoundError: No module named 'tensorflow.python.platform' Import error 导入模块失败:ModuleNotFoundError:没有名为“文件夹”的模块 - Fail to import a Module: ModuleNotFoundError: No module named 'folder' 错误:ModuleNotFoundError:没有名为“图像”的模块 - Error:ModuleNotFoundError: No module named 'Image' 错误:ModuleNotFoundError:没有名为“termios”的模块 - Error: ModuleNotFoundError: No module named 'termios'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM