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