我现在很困惑。这是项目树:
project
- source
- - lib
- - - __init__.py
- - - utils.py
- - - stats.py
- test
- - lib
- - - test_stats.py
stats.py
has import utils
,如果执行的话确实有效stats.py
本身。现在test_stats.py
has import lib.stats
但这会导致ModuleNotFoundError: No module named 'utils'
如果执行为错误PYTHONPATH=source pytest
in the project
目录:
==================================== 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 ============================
发生了什么事以及如何使用这样的目录结构正确执行测试?
P.S.我知道(开发模式)pip install ...
and tox
技巧(用于模块搜索路径),但我想了解它们是否是绝对必要的,或者我已经假设这个简单的设置出了问题。
import utils
在Python 3中是绝对导入,Python看起来是模块utils
in sys.path
.
当你跑步时stats.py
作为脚本 Python 添加目录project/source/lib/
to sys.path
. So import utils
在剧本作品中。
但当你跑步时test_stats.py
Python不添加project/source/lib/
to sys.path
. So import utils
不起作用。
克服这个问题的一种方法是使用相对导入:from . import utils
. In stats.py
意思是:不要搜索sys.path
,导入模块utils
来自与以下相同的目录stats.py
。但随后你就失去了奔跑的能力stats.py
作为脚本。所以将主要代码从stats.py
到外部的单独脚本lib/
.
一个稍微不同的解决方案是将主代码从stats.py
到模块__main__.py
并使用执行模块python -m lib
(project/source/
必须在sys.path
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)