pytest-dev / pytest

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing
https://pytest.org
MIT License
11.95k stars 2.66k forks source link

Pytest fails to find some libraries #10885

Open yurivict opened 1 year ago

yurivict commented 1 year ago

While trying to run pytest on the TA-Lib project (and many other projects) it fails to find this library:

cd /usr/ports/finance/py-ta-lib/work-py39/TA-Lib-0.4.26/talib && /usr/bin/env XDG_DATA_HOME=/usr/ports/finance/py-ta-lib/work-py39  XDG_CONFIG_HOME=/usr/ports/finance/py-ta-lib/work-py39  XDG_CACHE_HOME=/usr/ports/finance/py-ta-lib/work-py39/.cache  HOME=/usr/ports/finance/py-ta-lib/work-py39 PATH=/usr/local/libexec/ccache:/usr/ports/finance/py-ta-lib/work-py39/.bin:/home/yuri/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin PKG_CONFIG_LIBDIR=/usr/ports/finance/py-ta-lib/work-py39/.pkgconfig:/usr/local/libdata/pkgconfig:/usr/local/share/pkgconfig:/usr/libdata/pkgconfig MK_DEBUG_FILES=no MK_KERNEL_SYMBOLS=no SHELL=/bin/sh NO_LINT=YES LDSHARED="cc -shared" PYTHONDONTWRITEBYTECODE= PYTHONOPTIMIZE= PREFIX=/usr/local  LOCALBASE=/usr/local  CC="cc" CFLAGS="-O2 -pipe  -fstack-protector-strong -fno-strict-aliasing "  CPP="cpp" CPPFLAGS=""  LDFLAGS=" -fstack-protector-strong " LIBS=""  CXX="c++" CXXFLAGS="-O2 -pipe -fstack-protector-strong -fno-strict-aliasing  "  MANPREFIX="/usr/local" CCACHE_DIR="/tmp/.ccache" BSD_INSTALL_PROGRAM="install  -s -m 555"  BSD_INSTALL_LIB="install  -s -m 0644"  BSD_INSTALL_SCRIPT="install  -m 555"  BSD_INSTALL_DATA="install  -m 0644"  BSD_INSTALL_MAN="install  -m 444" PYTHONPATH=/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages /usr/local/bin/python3.9 -m pytest -k '' -rs -v -o addopts= 
========================================================================================== test session starts ==========================================================================================
platform freebsd13 -- Python 3.9.16, pytest-7.2.2, pluggy-1.0.0 -- /usr/local/bin/python3.9
cachedir: .pytest_cache
hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/usr/ports/finance/py-ta-lib/work-py39/TA-Lib-0.4.26/talib/.hypothesis/examples')
Using --randomly-seed=1501004421
rootdir: /usr/ports/finance/py-ta-lib/work-py39/TA-Lib-0.4.26
plugins: forked-1.4.0, hypothesis-6.70.0, mypy-plugins-1.10.1, cov-2.9.0, xdist-2.5.0, randomly-3.12.0, timeout-2.1.0, rerunfailures-10.1, flaky-3.7.0, env-0.6.2, freezegun-0.4.2, mock-3.10.0
collected 0 items / 6 errors                                                                                                                                                                            

================================================================================================ ERRORS =================================================================================================
________________________________________________________________________________ ERROR collecting talib/test_abstract.py ________________________________________________________________________________
ImportError while importing test module '/usr/ports/finance/py-ta-lib/work-py39/TA-Lib-0.4.26/talib/test_abstract.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/local/lib/python3.9/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
__init__.py:93: in <module>
    from ._ta_lib import (
E   ModuleNotFoundError: No module named 'talib._ta_lib'
__________________________________________________________________________________ ERROR collecting talib/test_data.py __________________________________________________________________________________

talib._ta_lib is installed into a system-wide directory (/usr/local/lib/python3.9/site-packages/talib/_ta_lib.cpython-39.so), and import talib succeeds in Python.

py39-pytest-7.2.2,1 Python-3.9 FreeBSD 13.1

RonnyPfannschmidt commented 1 year ago

This looks like the source tree that's not having any build artifacts is used as import root for pytest due to fs Layout

yurivict commented 1 year ago

The package is installed into the stage directory /usr/ports/finance/py-ta-lib/work-py39/stage PYTHONPATH is set to /usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages All artifacts are there:

$ find /usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__init__.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/abstract.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/deprecated.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/stream.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/test_abstract.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/test_data.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/test_func.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/test_pandas.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/test_polars.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/test_stream.py
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/_ta_lib.cpython-39.so
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/deprecated.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/__init__.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/abstract.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_abstract.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/stream.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/__init__.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_data.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_func.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_pandas.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_polars.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_stream.cpython-39.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_abstract.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/abstract.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/deprecated.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/stream.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_pandas.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_data.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_func.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_polars.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/talib/__pycache__/test_stream.cpython-39.opt-1.pyc
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/TA_Lib-0.4.26-py3.9.egg-info
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/TA_Lib-0.4.26-py3.9.egg-info/PKG-INFO
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/TA_Lib-0.4.26-py3.9.egg-info/SOURCES.txt
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/TA_Lib-0.4.26-py3.9.egg-info/dependency_links.txt
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/TA_Lib-0.4.26-py3.9.egg-info/requires.txt
/usr/ports/finance/py-ta-lib/work-py39/stage/usr/local/lib/python3.9/site-packages/TA_Lib-0.4.26-py3.9.egg-info/top_level.txt

What is missing?

RonnyPfannschmidt commented 1 year ago

Based on the code layout the collection in the working directory will force pytest to shadow the staging directory after adding something to sys. Path to be able to import from the working directory

There is a plan to correctly handle the duality between collect in the checkout but import from install location, however that is not implemented

It may be possible to use --pyargs talib

yurivict commented 1 year ago

Adding --pyargs talib in fact corrects the problem.

RonnyPfannschmidt commented 1 year ago

Please note that this is only a workaround, the correct fix is not yet implemented