Python 当使用pytest时,从哪个根目录加载模块?

Python 当使用pytest时,从哪个根目录加载模块?,python,pytest,python-module,Python,Pytest,Python Module,我很困惑 我有一个文件/app/bar.py 和一个文件/app/test/test\u foo.py 当我从app目录运行pytest时,我得到一个错误,该模块无法解析 /app# pytest ============================= test session starts ============================== platform linux -- Python 3.7.4, pytest-5.0.1, py-1.8.0, pluggy-0.12.0

我很困惑

我有一个文件/app/bar.py

和一个文件/app/test/test\u foo.py

当我从app目录运行pytest时,我得到一个错误,该模块无法解析

/app# pytest
============================= test session starts ==============================
platform linux -- Python 3.7.4, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /app
collected 1 item                                                               

test/test_foo.py F                                                       [100%]

=================================== FAILURES ===================================
__________________________________ test_false __________________________________

    def test_false():
        import os
        print(f'dir: {os.getcwd()}')
>       from bar import val
E       ModuleNotFoundError: No module named 'bar'

test/test_foo.py:4: ModuleNotFoundError
----------------------------- Captured stdout call -----------------------------
dir: /app
=========================== 1 failed in 0.27 seconds ===========================
我可以发誓我以前做过这件事,但我知道我每次都在努力解决模块解析的根源是什么

这方面的实际规则是什么?我应该如何引用模块栏以便将其导入测试

编辑:我了解到搜索的位置是sys.path中的位置。在我的例子中,它包括/app/test目录和一系列其他目录,但不包括/app,我认为这显然是一个pytest问题-如果是当前目录,为什么/app不在该列表中?

pytest查看以下位置以定位导入:

PYTHONPATH环境变量-此环境变量可设置为目标文件所在的路径。 安装库的库目录 程序的主目录。这是pytest运行安装目录的路径,而不是运行测试的目录。 sys.path:使用sys.path.append或sys.path.insert将所需目录添加到sys.path。 如果您希望隐式包含当前目录,那么以python-m pytest abc.py而不是pytest abc.py的形式运行测试

啊,有趣的是,python-m pytest确实让它工作了-那么这与pytest有什么区别呢?为什么即使os.getcwd返回它,后者也不包括它正在运行的目录?如果要运行pytest…,请在app/中放入一个空的conftest.py文件,否则要么调整PYTHONPATH,要么运行python-m pytest。。。。为了能够导入bar,包含bar.py的父目录必须位于sys.path中,无论您选择以何种方式将其放入其中。python-m pytest与调用pytest不同;一个是特定于python的,在sys.path中查找名为pytest.py的模块并执行它,另一个是运行名为pytest的任意可执行文件。它们甚至不是正在执行的相同文件。python-m将pwd添加到sys.path中,而任意可执行文件不添加pwd。另外,请参见
def test_false():
    import os
    print(f'dir: {os.getcwd()}')
    from bar import val
    assert val == 5
/app# pytest
============================= test session starts ==============================
platform linux -- Python 3.7.4, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /app
collected 1 item                                                               

test/test_foo.py F                                                       [100%]

=================================== FAILURES ===================================
__________________________________ test_false __________________________________

    def test_false():
        import os
        print(f'dir: {os.getcwd()}')
>       from bar import val
E       ModuleNotFoundError: No module named 'bar'

test/test_foo.py:4: ModuleNotFoundError
----------------------------- Captured stdout call -----------------------------
dir: /app
=========================== 1 failed in 0.27 seconds ===========================