Ale*_*aev 4 python python-import pytest python-3.x
我现在很困惑。这是项目树:
project
- source
- - lib
- - - __init__.py
- - - utils.py
- - - stats.py
- test
- - lib
- - - test_stats.py
Run Code Online (Sandbox Code Playgroud)
stats.pyhas import utils,如果执行stats.py自己,它确实有效。现在test_stats.py有import lib.stats但是ModuleNotFoundError: No module named 'utils'如果PYTHONPATH=source pytest在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 ============================
Run Code Online (Sandbox Code Playgroud)
发生了什么以及如何使用这种目录结构正确执行测试?
PS 我知道(开发模式)pip install ...和tox技巧(用于模块搜索路径),但我想了解它们是否是绝对必要的,或者我已经假设这个简单的设置有问题。
import utils在 Python 3 中是绝对导入,Pythonutils在sys.path.
当您stats.py作为脚本运行时,Python 会将目录添加project/source/lib/到sys.path. 所以import utils在剧本作品中。
但是当您运行test_stats.pyPython 时,不会添加project/source/lib/到sys.path. 所以import utils不起作用。
克服这个问题的一种方法是使用相对导入:from . import utils. 在stats.py它的意思是:不要搜索sys.path,导入模块utils来自同一个目录stats.py。但是你失去了stats.py作为脚本运行的能力。因此,从移动主代码stats.py到一个单独的脚本之外lib/。
一个稍微不同的解决方案是将主代码从stats.py模块移动到模块__main__.py并使用python -m lib( project/source/must be in sys.path)执行模块。
| 归档时间: |
|
| 查看次数: |
3483 次 |
| 最近记录: |