【问题标题】:Using PyBind11 with a virtual environment created at runtime将 PyBind11 与运行时创建的虚拟环境一起使用
【发布时间】:2022-01-14 07:11:05
【问题描述】:

我的目标是使用 PyBind11 嵌入 python 解释器,但要使用虚拟环境中的解释器,这样使用 pip 安装依赖项就不会弄乱系统路径。

网上没有太多关于这个话题的信息。 Embedding python with pybind11. Virtual environment doesn't work 在编译时硬编码 venv。这还不够,因为 venv 那时并不存在,而是会在运行时启用脚本引擎时创建。

目前的计划是将pip install --target 放入缓存目录并将其添加到sys.path。使用系统解释器。这是“好的”,但最好不要使用系统解释器。

【问题讨论】:

  • 我不明白在你的情况下如何避免使用外部解释器?你想安装依赖项,所以你需要一个 python 安装,所以除非你想创建一个单独的可执行文件,使用嵌入式 pybind11 解释器运行pip(这看起来有点过分),我没有看到问题使用您的“缓存”解决方案。

标签: python c++ virtualenv pybind11 python-embedding


【解决方案1】:

您不需要虚拟环境来为您的软件提供独立的依赖项,或者在本地使用它们,您只需要现有的:一个独立的lib 文件夹。

pybind11 没有自己的解释器 (AFAIK),它嵌入了您在编译时使用的 Python 构建版本中的解释器,因此您应该已经拥有要嵌入的 Python 解释器的匹配版本(这是如果您使用 CMake,则传递给 PYTHON_EXECUTABLE 的可执行文件)。

您应该改变的唯一事情是不要使用sys.path,而是使用site.addsitedir,因为sys.path 不会处理所有内容(例如,.pth 文件),而site.addsitedir 会,很简单:

py::module_::import("site").attr("addsitedir")(/* whatever */);

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2017-03-23
    • 2021-07-30
    • 2019-11-16
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多