我发现了许多类似的问题,但没有一个现有的线程讨论这个确切的情况。
我有一个简单的python模块和pytest:
project
mymod
__init__.py
const.py
mymodclass.py
tests
test_mymodclass.py
conftest.py
我的模块实现类包括 const.py 文件,以便使用 CONSTANT:
from const import CONSTANT
class MyModClass:
def initialize(self):
return CONSTANT
def main():
test_mod = MyModClass()
test_mod.initialize()
if __name__ == "__main__":
main()
运行mymodclass.py
工作得很好。 运行python mymodclass.py
工作得很好。
现在我想运行一些 pytest 单元测试。这些可以在test_mymodclass.py
中找到:
from mymod.mymodclass import MyModClass
test_mod = MyModClass()
assert( test_mod.initialize() == CONSTANT )
但是,从project
文件夹运行pytest
会导致错误:
E ModuleNotFoundError: No module named 'const'
pytest 似乎找不到mymodclass.py
在本地文件夹中找到的const.py
。
我可以更改mymodclass.py
导入from mymod.const import *
,pytest 将起作用! 不幸的是,现在python无法直接从mymod
文件夹执行mymodclass.py
:
ModuleNotFoundError: No module named 'mymod'
看起来我可以让 python 高兴或 pytest 开心,但不能两者兼而有之。
从project/mymod
目录内部运行python mymodclass.py
时import const
工作的原因是因为 Python 将当前工作目录添加到sys.path
中。这允许将const
解析为./const.py
。
但是,当运行测试时,当前工作目录很可能project/
,因此尝试导入const
将尝试解析不存在的project/const.py
。将其更改为mymod.const
会将模块解析为project/mymod/const.py
,这有效。
如果要直接运行mymodclass.py
,同时仍使用import mymod.const
,请确保工作目录project/
,并按python mymod/mymodclass.py
调用脚本。