找不到模块在命令行上运行

时间:2019-03-11 13:21:32

标签: python

我具有以下项目结构:

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'

2 个答案:

答案 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

但是,再次尝试限制此功能。