Introduction#
In Python, some packages are written mainly or partially in C++, and the Python interfaces are just wrappers around the binary C++ module. Among these packages, there is OpenCV.
When I use python-lsp-server or pyright with Neovim1, I can not get method completion for the OpenCV package. This is because the OpenCV projects is developed using C++ and does not have stub files2 shipped yet.
Using stub file from project python-type-stubs#
Fortunately, the project python-type-stubs provides stub files for several projects including OpenCV. To use the stub file, first find where OpenCV is installed on your system:
python -c 'import os, cv2; print(os.path.dirname(cv2.__file__))'
Then download the stub file and put it in the same directory as OpenCV.
curl -sSL https://raw.githubusercontent.com/microsoft/python-type-stubs/main/cv2/__init__.pyi \
-o path/to/opencv/directory/__init__.pyi
Then restart nvim, the auto-completion for OpenCV should work as expected.
Using stubgen
#
We can also use stubgen
to generate the stub files, like this:
# stubgen is installed via mypy package
pip install -U mypy
stubgen -m cv2
The stub file will be saved under the out/
directory.
However, the stub file generated by stubgen lacks doc and is not as good as stub file provided by project python-type-stubs.
For more info on using stubgen, visit its page.
References#
- what is the use of stub files in Python: https://stackoverflow.com/q/59051631/6064933
- relevant issue on OpenCV repo: https://github.com/opencv/opencv/issues/14590
- discussion on pylance repo: https://github.com/microsoft/pylance-release/issues/138#issuecomment-874363285