pybind11 解释器使用捆绑的 python 可执行文件

Posted

技术标签:

【中文标题】pybind11 解释器使用捆绑的 python 可执行文件【英文标题】:pybind11 interpreter use bundled python executable 【发布时间】:2021-07-14 19:04:22 【问题描述】:

我在 c++ 应用程序中使用 pybind11 解释器。不幸的是,由于遗留原因,我不使用 CMake 构建,而是使用 qmake。因此,我很难理解如何正确设置 pybind11 解释器。 c++ 应用程序将附带捆绑的 python 3.7(因此在 Mac 上,应用程序捆绑包将附带 python.framework)

解释器应该使用捆绑的 python (MyApp.app/Contents/Frameworks/Python.framework/Versions/Current/Python),但是在打印 sys.exec_prefix 时,它总是回退到它发现安装的任何东西,所以在我的例子中:/Library/Frameworks/Python.framework/Versions/3.9/Python

我的 .pro 设置如下所示:

QMAKE_LFLAGS += -F/$$PWD/../3rdParty/python
LIBS += -framework Python

INCLUDEPATH += $$PWD/../3rdParty/python/Python.framework/Versions/3.7/include/python3.7m
DEPENDPATH += $$PWD/../3rdParty/python/Python.framework/Versions/3.7/include/python3.7m

如何告诉 pybind11 / 我的可执行文件使用什么 python 可执行文件和环境?不应强制目标用户安装 python 来运行我的应用程序

【问题讨论】:

【参考方案1】:

我必须将PYTHONHOME 设置为MyApp.app/Contents/Frameworks/Python.framework/Versions/3.7

PYTHONPATHMyApp.app/Contents/Frameworks/Python.framework/Versions/3.7/lib/python3.7

在 Qt 中,我通过在 py::scoped_interpreter guard; 之前调用 qputenv 来做到这一点

【讨论】:

不使用 qputenv,而是调用 'Py_SetPythonHome' 和 'Py_SetPath' 似乎是个好主意

以上是关于pybind11 解释器使用捆绑的 python 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 dict 和 pybind11

Pybind11 多处理挂起

基于pybind11实现Python调用c++编写的CV算法--下 (Linux+Cmake)

如何通过pybind11在python中捕获C++的异常?

基于pybind11为C++提供Python接口

pybind11:将 MPI 通信器从 Python 发送到 CPP