如何在 Clion 中使用虚拟环境从 C++ 调用 Python?

Posted

技术标签:

【中文标题】如何在 Clion 中使用虚拟环境从 C++ 调用 Python?【英文标题】:How to use a virtual environment to call Python from C++ in Clion? 【发布时间】:2021-03-08 07:25:03 【问题描述】:

我想在 Clion 中使用虚拟环境从 C++ 调用 Python。

当我在终端上运行它时,我可以在 C++ 上使用Py_Initialize();,但是当我在 Clion 上运行它时,我不能使用它。 以下是在 Clion 中运行时的错误信息。

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007fbd24916680 (most recent call first):

在终端上,我使用 GNU Make 通过进入 Anaconda 虚拟环境来构建和运行代码。然后代码按预期工作。

另一方面,在 Clion 上,我想如果我在 Python Interpreter 中从 File/Build, Execution, Deployment/Python Interpreter/ 设置 Anaconda 虚拟环境,它会在运行时被引用。但是,似乎引用无法正常工作并且发生了上述错误。上面的错误也是我在终端运行代码没有进入虚拟环境的时候出现的。

有人知道怎么设置吗? 谢谢。

== 附加部分 == 这是 CMakeList.txt

cmake_minimum_required( VERSION 3.6 )
# Create Project
project( Python2CPP )

# Require C++14 (or Later)
set( CMAKE_CXX_STANDARD 14)
set( CMAKE_CXX_STANDARD_REQUIRED ON )

find_package(OpenCV REQUIRED)

add_definitions("-DNOMINMAX")

set(CMAKE_EXE_LINKER_FLAGS "$CMAKE_EXE_LINKER_FLAGS -pthread")
set(CMAKE_MODULE_PATH $PROJECT_SOURCE_DIR/cmake)

add_executable( 
    Python2CPP
    src/main.cpp
    src/Python2CPP.cpp
    src/Python2CPP.h )

set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "Python2CPP" )

# virtual python env from anaconda
set(PYTHON_INCLUDE_DIRS /home/masahiro/anaconda3/envs/virt/include/python3.6m)
set(NUMPY_INCLUDE_DIRS /home/masahiro/anaconda3/envs/virt/lib/python3.6/site-packages/numpy/core/include)
set(PYTHON_LIBRARIES /home/masahiro/anaconda3/envs/virt/lib/libpython3.6m.so)

include_directories(
    $PYTHON_INCLUDE_DIRS
    $NUMPY_INCLUDE_DIRS
    $OpenCV_INCLUDE_DIRS)

target_link_libraries(
    Python2CPP
    $PYTHON_LIBRARIES
    $OpenCV_LIBS
)

【问题讨论】:

你能展示你的 CMakeLists.txt 吗?您可能找不到 Python 解释器:find_package(PythonInterp REQUIRED) @jignatius 感谢您的评论。我添加了 CMakeLists.txt。其实我也不确定应该找哪个包,所以直接写了虚拟环境的Path。 【参考方案1】:

我已经修改了您的 CMakeLists.txt 以使用查找 Python 解释器和 Python 库的标准方法。你能给它吗?如果你有 CMake 3.14 或更高版本,那么找到 NumPy 的能力已经是built in。

cmake_minimum_required( VERSION 3.14 )
# Create Project
project( Python2CPP )

# Require C++14 (or Later)
set( CMAKE_CXX_STANDARD 14)
set( CMAKE_CXX_STANDARD_REQUIRED ON )

find_package(Python3 COMPONENTS Interpreter Development NumPy REQUIRED)
find_package(OpenCV REQUIRED)

add_definitions("-DNOMINMAX")

add_executable(
    Python2CPP
    src/main.cpp
    src/Python2CPP.cpp
    src/Python2CPP.h)

set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "Python2CPP" )

target_include_directories(Python2CPP PRIVATE $Python3_INCLUDE_DIRS $OpenCV_INCLUDE_DIRS $Python3_NumPy_INCLUDE_DIRS)

target_link_libraries(Python2CPP PRIVATE $Python3_LIBRARIES $OpenCV_LIBS)

否则,如果你有旧版本的 CMake,那么你可以添加一个测试来检查 NumPy 是否可用:

cmake_minimum_required( VERSION 3.6 )
# Create Project
project( Python2CPP )

# Require C++14 (or Later)
set( CMAKE_CXX_STANDARD 14)
set( CMAKE_CXX_STANDARD_REQUIRED ON )

find_package(PythonInterp REQUIRED)
find_package(PythonLibs $PYTHON_VERSION_MAJOR.$PYTHON_VERSION_MINOR EXACT REQUIRED)

find_package(OpenCV REQUIRED)

# Find NumPy location
execute_process(
        COMMAND
        $PYTHON_EXECUTABLE "-c" "import re, numpy; print(re.compile('/__init__.py.*').sub('',numpy.__file__))"
        RESULT_VARIABLE _numpy_status
        OUTPUT_VARIABLE _numpy_location
        ERROR_QUIET
        OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT _numpy_status)
    set(NumPy $_numpy_location CACHE STRING "Location of NumPy")
endif()

# Find NumPy version
execute_process(
        COMMAND
        $PYTHON_EXECUTABLE "-c" "import numpy; print(numpy.__version__)"
        OUTPUT_VARIABLE _numpy_version
        ERROR_QUIET
        OUTPUT_STRIP_TRAILING_WHITESPACE
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NumPy
        FOUND_VAR NumPy_FOUND
        REQUIRED_VARS NumPy
        VERSION_VAR _numpy_version)

add_definitions("-DNOMINMAX")

add_executable( 
    Python2CPP
    src/main.cpp
    src/Python2CPP.cpp
    src/Python2CPP.h )

set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "Python2CPP" )

target_include_directories(Python2CPP PRIVATE $PYTHON_INCLUDE_DIRS $OpenCV_INCLUDE_DIRS)

target_link_libraries(Python2CPP PRIVATE $PYTHON_LIBRARIES $OpenCV_LIBS)

Python 虚拟环境

在构建您的 C++ 程序之前,请激活您的 Python 虚拟环境。如果您使用的是 CLion,它有终端选项卡。选择它并像这样激活您的虚拟环境:source &lt;virtual environment path&gt;/bin/activate。然后 cmake 应该会找到正确的 Python 解释器。

【讨论】:

@Masahiro 你过得怎么样?我补充说你应该在运行 cmake 之前激活你的 Python 虚拟环境。然后它会找到正确的 Python 解释器。或者将虚拟环境目录添加到您的路径中。 感谢您的回复,很抱歉回复晚了。该通知对我来说效果不佳。虚拟环境的激活不起作用。所以我会尝试将虚拟环境目录添加到我的路径中,但我不确定如何添加它。 @Masahiro 在 CLion 中有一个终端选项卡。去那里并像这样激活虚拟环境:source &lt;path to virtual environment&gt;/bin/activate。然后使用 CLion 构建或从终端运行 CMake,它应该会找到正确的 Python 解释器。 我可以使用您建议的 CMake 文件在终端上成功运行代码。我用:cmake -DPython3_EXECUTABLE=&lt;virtual environment path&gt; .. 编译。但我仍然无法在 Clion 上调试它。 终于明白你的意思了!我注意到了this

以上是关于如何在 Clion 中使用虚拟环境从 C++ 调用 Python?的主要内容,如果未能解决你的问题,请参考以下文章

Clion(CMake工具)中如何引入第三方库

如何安装配置clion开发环境

C++工程实践必备技能

C++工程实践必备技能

如何使用自制软件、cMake 和 cLion 将库添加到 C++ 项目

如何在纯c++环境中使用qt中的图像?