封装Python和调用C++模块的坑(使用pyinstaller和pybind11)
作者:互联网
Python 部分
依赖库的 pip 安装
创建虚拟环境并进入虚拟环境:
conda create --name bundle python=3.7 conda activate bundle
在虚拟环境下:
pip install torch===1.3.1 torchvision==0.2.2.post3 -f https://download.pytorch.org/whl/torch_stable.html
pip install opencv-python==4.2.0.32 dlib==19.19.0 pyinstaller==3.6
Pillow 的版本不能过高,需要降级:
pip install --upgrade pillow==6.0.0
setuptools 的版本不能过高,需要降级:
pip install --upgrade setuptools==40.8.0
C++ 部分
pybind11
头文件
- 在 include 中包含 pybind11 头文件。
- 把 Python 虚拟环境头文件路径装进来:D:\develop\Anaconda3\envs\bundle\include。
库文件
把 Python 虚拟环境(注意,一定要是 pyinstaller 所在的那个虚拟环境)的库文件目录装进来:D:\develop\Anaconda3\envs\bundle\libs。
加入链接库文件:
_tkinter.lib python3.lib python37.lib
暴露接口
1 #include <pybind11/pybind11.h> 2 namespace py = pybind11; 3 4 #include <iostream> 5 #include "SingleKinect.h" 6 7 8 PYBIND11_MODULE(main, m) { 9 // shorthand 10 using namespace pybind11::literals; 11 m.doc() = "pybind11 example plugin"; 12 13 // Creating bindings for a custom type 14 py::class_<ws_tech::SingleKinect>(m, "SingleKinect") 15 .def(py::init<py::function, int>()) 16 .def("Open", &ws_tech::SingleKinect::Open) 17 .def("Running", &ws_tech::SingleKinect::Running) 18 .def("Close", &ws_tech::SingleKinect::Close); 19 }
更改输出类型:动态库、后缀为 pyc。
打包过程问题
pyinstall 打包
pyinstaller -F .\runner.py
必要的运行时库
- vcruntime140_1.dll
参考
- 总结Pyinstaller的坑及终极解决方法
- ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'
- New Pillow version (7.0.0) breaks torchvision (ImportError: cannot import name 'PILLOW_VERSION' from 'PIL')
- ImportError: DLL load failed 高效解决方法 Win10+Python3.7+Anaconda2019.03+tensorflow-gpu2.0/1.14+CUDA10.0
标签:install,Python,C++,虚拟环境,SingleKinect,pybind11,pip,include 来源: https://www.cnblogs.com/noluye/p/12367748.html