简体   繁体   English

使用 pybind11 嵌入 python。 虚拟环境不起作用

[英]Embedding python with pybind11. Virtual environment doesn't work

I am trying to make a simple c++ application which translates phrases using googletrans python library.我正在尝试制作一个简单的 c++ 应用程序,它使用googletrans python 库翻译短语。 So I've chosen pybind11 for this purpose to embed python .所以我为此选择了pybind11嵌入 python Also I use cmake for code configuration.我也使用 cmake 进行代码配置。

Everything works just fine when I'm using the global python installation, but I don't understand how to use virtual environment with pybind and the whole process of setting the correct python interpreter, paths etc. in cmake much.当我使用全局 python 安装时,一切正常,但我不明白如何在 pybind 中使用虚拟环境以及在 cmake 中设置正确的 python 解释器、路径等的整个过程。

I've found this stackoverflow thread: Embedding pybind11 with virtual environment我找到了这个 stackoverflow 线程: Embedding pybind11 with virtual environment

I set all the variables as @ipa did.我像@ipa 一样设置了所有变量。 Just look at the CMakeLists.txt and main.cpp :看看CMakeLists.txtmain.cpp

cmake_minimum_required(VERSION 3.15)
project("cpp_google_trans")

set(
    PYTHON_EXECUTABLE "${CMAKE_HOME_DIRECTORY}/venv/Scripts/python.exe"
    CACHE FILEPATH "python virtual environment executable")
message(STATUS "PYTHON_EXECUTABLE is now: ${PYTHON_EXECUTABLE}")    #DEBUG

set(ENV{PYTHONPATH} "${CMAKE_HOME_DIRECTORY}/venv/Lib/site-packages")
message(STATUS "ENV{PYTHONPATH} is now: $ENV{PYTHONPATH}")  #DEBUG

set(
    ENV{PATH}
    "${CMAKE_HOME_DIRECTORY}/venv/Scripts/;${CMAKE_HOME_DIRECTORY}/venv/Lib"
)
message(STATUS "PATH is now: $ENV{PATH}")   #DEBUG

add_subdirectory(pybind11)

add_executable(app main.cpp)
target_link_libraries(app PRIVATE pybind11::embed)

main.cpp : main.cpp :

#include <iostream>
#include <string>
#include <pybind11/embed.h>
namespace py = pybind11;

int main() {
    py::scoped_interpreter guard{};

    auto sys = py::module::import("sys");
    py::print("Hello, World from Python!");
    py::print(sys.attr("executable"));
    py::print(sys.attr("version"));

    system("set PATH");

    std::cin.get();

    // system("powershell");
    // I was looking at the environment variables in the powershell, but there wasn't any variables I set in CMakeLists.txt

    // Here I get abort() when trying to import googletrans package.
    // The package is installed in the venv virtual environment.
    // When the package is installed globally there isn't any problem.
    py::object Translator = py::module::import("googletrans").attr("Translator");
    py::object translator = Translator();

    std::cout << "C++ program here!\nTell a phrase you want to translate to english: ";
    std::string phrase;
    std::getline(std::cin, phrase);

    std::cout << "\n\nThe phrase in english means: ";
    std::cout << translator.attr("translate")(py::cast(&phrase)).attr("text").cast<std::string>();
}

When looking at the cmake configuration output everything seems working well (instead of PythonLibs variable I don't know how to change):在查看 cmake 配置输出时,一切似乎都运行良好(而不是 PythonLibs 变量,我不知道如何更改):

-- Building for: Visual Studio 16 2019
-- The C compiler identification is MSVC 19.22.27812.2
-- The CXX compiler identification is MSVC 19.22.27812.2
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.22.27812/bin/Hostx64/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.22.27812/bin/Hostx64/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.22.27812/bin/Hostx64/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.22.27812/bin/Hostx64/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- PYTHON_EXECUTABLE is now: D:/dev/Pybind/cpp_google_trans2/venv/Scripts/python.exe
-- ENV{PYTHONPATH} is now: D:/dev/Pybind/cpp_google_trans2/venv/Lib/site-packages
-- PATH is now: D:/dev/Pybind/cpp_google_trans2/venv/Scripts/;D:/dev/Pybind/cpp_google_trans2/venv/Lib    
-- Found PythonInterp: D:/dev/Pybind/cpp_google_trans2/venv/Scripts/python.exe (found version "3.7.3")    
-- Found PythonLibs: D:/Programs/VisualStudio/Shared/Python37_64/libs/Python37.lib
-- pybind11 v2.3.dev1
-- Configuring done
-- Generating done
-- Build files have been written to: D:/dev/Pybind/cpp_google_trans2/build

I also tried to set PYTHON_EXECUTABLE and PATH environment variables globally through control panel>system and security>system>advanced system settings>advanced>environment variables , but even this didn't help.我还尝试通过control panel>system and security>system>advanced system settings>advanced>environment variables全局设置 PYTHON_EXECUTABLE 和 PATH control panel>system and security>system>advanced system settings>advanced>environment variables ,但即使这样也无济于事。

I am still pretty new to cmake, python and pybind11 and I am aware of that I don't know a lot of things.我对 cmake、python 和 pybind11 还是很陌生,我知道我不知道很多事情。 And maybe you've noticed this while reading this thread.也许您在阅读此主题时已经注意到这一点。 ;P ;P

The solution involves two parts.解决方案包括两部分。

Compile the virtualenv PYTHONPATH into your C++ program将 virtualenv PYTHONPATH编译到您的 C++ 程序中
In CMake, this can be done with target_compile_definitions .在 CMake 中,这可以通过target_compile_definitions来完成。 The custom path will be available as a preprocessor macro.自定义路径将作为预处理器宏提供。

target_compile_definitions(app PRIVATE -DCUSTOM_SYS_PATH="\"${CMAKE_HOME_DIRECTORY}/venv/Lib/site-packages\"")

Update the Python sys.path right starting the interpreter.更新 Python sys.path正确启动解释器。

This is pybind-specific, but ought to look something like:这是特定于 pybind 的,但应该类似于:

py::module sys = py::module::import("sys");
sys.attr("path").attr("insert")(1, CUSTOM_SYS_PATH);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM