我具有以下项目结构:
project/
example/
__init__.py
foo.py
boo.py
meh.py
tests/
example/
test_foo.py
test_boo.py
test_meh.py
例如,我将foo.py
中的boo.py
导入为import example.foo as f
。我正在使用python3 -m pytest -s -v --cov tests
在根文件夹(项目)上运行测试。单元测试运行非常顺利,但是当我尝试以python3 example/boo.py
的身份运行单个文件时,出现错误:
ModuleNotFoundError: No module named 'example'
答案 0 :(得分:4)
环境变量通常是一个问题。您可以使用以下命令强制使用路径,并且导入在所有情况下均应起作用:
import sys
sys.path.append("/absolute/module/path")
import local_module
答案 1 :(得分:1)
实际上不应运行包中的模块(某些例外)。
但是,如果您确实需要,可以在运行模块之前设置PYTHONPATH。对于一个,请使用例如
PYTHONPATH=$(pwd) python3 example/boo.py
一种替代方法是使用相对导入:from . import foo as f
中的boo.py
。但这仍然意味着不应真正运行模块。
要详细说明: 应该导入模块,而不要像脚本一样运行。那就是模块的目的。如果出于某种原因,您确实确实确实需要执行模块,则1 /重新考虑,2 /重写模块,3 /通过在模块内部调用必要的函数将脚本包装在模块周围(并保留模块的内容)。脚本本身相对较短)。
请注意,setuptools
已通过entry points具有此功能。
一个更简单的选择是使用适当的
if __name__ == '__main__':
main()
模块末尾的行,其中main()
调用模块功能,然后使用Python -m
开关执行模块:
python -m mypackage.mymodule
但是,再次尝试限制此功能。