活动介绍
file-type

C++与Miniconda虚拟环境结合调用Python函数

下载需积分: 5 | 29.54MB | 更新于2025-01-11 | 150 浏览量 | 8 下载量 举报 2 收藏
download 立即下载
Miniconda是一个轻量级的Anaconda发行版,它允许用户快速创建独立的Python环境,并管理大量的第三方库。本文将详细介绍如何在C++中调用Python的Miniconda虚拟环境中的带参数函数,并强调如何将此环境随应用程序一起打包,以便于集成了Python的Qt应用程序的部署。 1. Miniconda的基本概念 Miniconda是一个免费的、开源的发行版,它包含了Conda包管理器和Python。Conda是一个开源的包、依赖和环境管理系统,它可以运行在Windows、MacOS和Linux上。Miniconda与Anaconda的主要区别在于,Miniconda仅包含Python和Conda,而Anaconda则包含许多预先安装的科学计算库。 2. 创建Miniconda虚拟环境 创建虚拟环境是为了隔离项目依赖,避免版本冲突。使用Miniconda创建虚拟环境的命令通常如下: ``` conda create -n myenv python=3.8 ``` 激活虚拟环境: ``` conda activate myenv ``` 3. 在虚拟环境中安装第三方库 在激活的虚拟环境中,可以使用pip或conda命令安装所需的第三方库。 4. C++中调用Python代码 要在C++中调用Python代码,可以使用Python的C API,或者使用一些封装好的库,例如Boost.Python或者pybind11。这些库能够将C++代码与Python代码桥接起来。 5. 使用Python C API 通过Python C API,可以编写C代码来调用Python解释器。步骤如下: - 初始化Python解释器。 - 导入需要的Python模块。 - 调用模块中的函数。 - 传递参数给Python函数。 - 清理并关闭解释器。 示例代码: ```c #include <Python.h> int main() { PyObject *pName, *pModule, *pFunc; PyObject *pArgs, *pValue; // 初始化Python解释器 Py_Initialize(); // 导入Python模块 pName = PyUnicode_DecodeFSDefault("module_name"); pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule != NULL) { // 获取模块中的函数 pFunc = PyObject_GetAttrString(pModule, "function_name"); if (pFunc && PyCallable_Check(pFunc)) { // 准备参数 pArgs = PyTuple_Pack(1, PyLong_FromLong(10)); // 调用函数 pValue = PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); // 检查返回值 if (pValue != NULL) { // 处理返回值 Py_DECREF(pValue); } else { // 处理调用失败情况 PyErr_Print(); } Py_XDECREF(pFunc); } else { // 处理函数不可调用情况 } Py_DECREF(pModule); } else { // 处理模块未找到情况 } // 清理Python解释器 Py_Finalize(); return 0; } ``` 6. 使用Boost.Python或pybind11 除了Python C API,还可以使用Boost.Python或pybind11这样的库,它们提供了更简洁的接口来实现C++与Python之间的交互。 7. 将Miniconda环境打包 为了便于部署,可以将Miniconda环境与应用程序一起打包。这可以通过创建环境的快照、导出环境配置文件,或者使用Conda打包工具condapack等方法实现。 8. 部署时的注意事项 在部署时需要注意,目标机器上应该预先安装好Conda或Miniconda,并且拥有执行Python代码的权限。如果在应用程序中包含Conda打包的环境,需要确保目标机器上安装的Conda版本与打包时的版本兼容。 总结,通过上述步骤,可以实现在C++中调用Miniconda虚拟环境中的Python带参数函数,并将整个环境包含在应用程序中,以便于部署。这种方法特别适用于需要运行科学计算或者需要Python生态支持的Qt应用程序。"

相关推荐

filetype

(py311) PS D:\test_A> pip install matplotlib Traceback (most recent call last): File "D:\miniconda\envs\py311\Scripts\pip-script.py", line 9, in <module> sys.exit(main()) ^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\cli\main.py", line 64, in main cmd_name, cmd_args = parse_command(args) ^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\cli\main_parser.py", line 78, in parse_command general_options, args_else = parser.parse_args(args) ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\optparse.py", line 1371, in parse_args values = self.get_default_values() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\cli\parser.py", line 279, in get_default_values self.config.load() File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\configuration.py", line 124, in load self._load_config_files() File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\configuration.py", line 246, in _load_config_files config_files = dict(self.iter_config_files()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\configuration.py", line 339, in iter_config_files config_files = get_configuration_files() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\configuration.py", line 70, in get_configuration_files os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_internal\utils\appdirs.py", line 48, in site_config_dirs dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_vendor\platformdirs\__init__.py", line 146, in site_config_dir ).site_config_dir ^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_vendor\platformdirs\windows.py", line 67, in site_config_dir return self.site_data_dir ^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_vendor\platformdirs\windows.py", line 56, in site_data_dir path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\miniconda\envs\py311\Lib\site-packages\pip\_vendor\platformdirs\windows.py", line 209, in get_win_folder_from_registry directory, _ = winreg.QueryValueEx(key, shell_folder_name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [WinError 2] 系统找不到指定的文件。这是什么问题?如何解决?

filetype

(base) HwHiAiUser@orangepiaipro-20t:~/ros2_ws$ colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release Starting >>> astra_camera_msgs -- The C compiler identification is GNU 11.4.0 -- The CXX compiler identification is GNU 11.4.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found ament_cmake: 1.3.11 (/opt/ros/humble/share/ament_cmake/cmake) -- Found Python3: /usr/local/miniconda3/bin/python3 (found version "3.9.2") found components: Interpreter -- Found rosidl_default_generators: 1.2.0 (/opt/ros/humble/share/rosidl_default_generators/cmake) -- Using all available rosidl_typesupport_c: rosidl_typesupport_fastrtps_c;rosidl_typesupport_introspection_c -- Found rosidl_adapter: 3.1.6 (/opt/ros/humble/share/rosidl_adapter/cmake) -- Using all available rosidl_typesupport_cpp: rosidl_typesupport_fastrtps_cpp;rosidl_typesupport_introspection_cpp -- Found sensor_msgs: 4.8.0 (/opt/ros/humble/share/sensor_msgs/cmake) CMake Error at /opt/ros/humble/share/rosidl_adapter/cmake/rosidl_adapt_interfaces.cmake:59 (message): execute_process(/usr/local/miniconda3/bin/python3 -m rosidl_adapter --package-name astra_camera_msgs --arguments-file /home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/rosidl_adapter__arguments__astra_camera_msgs.json --output-dir /home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/rosidl_adapter/astra_camera_msgs --output-file /home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/rosidl_adapter/astra_camera_msgs.idls) returned error code 1: AttributeError processing template 'msg.idl.em' Traceback (most recent call last): File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/resource/__init__.py", line 51, in evaluate_template em.BUFFERED_OPT: True, AttributeError: module 'em' has no attribute 'BUFFERED_OPT' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/miniconda3/lib/python3.9/runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "/usr/local/miniconda3/lib/python3.9/runpy.py", line 87, in _run_code exec(code, run_globals) File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/__main__.py", line 19, in <module> sys.exit(main()) File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/main.py", line 53, in main abs_idl_file = convert_to_idl( File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/__init__.py", line 19, in convert_to_idl return convert_msg_to_idl( File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/msg/__init__.py", line 39, in convert_msg_to_idl expand_template('msg.idl.em', data, output_file, encoding='iso-8859-1') File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/resource/__init__.py", line 23, in expand_template content = evaluate_template(template_name, data) File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/resource/__init__.py", line 69, in evaluate_template _interpreter.shutdown() AttributeError: 'NoneType' object has no attribute 'shutdown' Call Stack (most recent call first): /opt/ros/humble/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:130 (rosidl_adapt_interfaces) CMakeLists.txt:17 (rosidl_generate_interfaces) -- Configuring incomplete, errors occurred! See also "/home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/CMakeFiles/CMakeOutput.log". --- stderr: astra_camera_msgs CMake Error at /opt/ros/humble/share/rosidl_adapter/cmake/rosidl_adapt_interfaces.cmake:59 (message): execute_process(/usr/local/miniconda3/bin/python3 -m rosidl_adapter --package-name astra_camera_msgs --arguments-file /home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/rosidl_adapter__arguments__astra_camera_msgs.json --output-dir /home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/rosidl_adapter/astra_camera_msgs --output-file /home/HwHiAiUser/ros2_ws/build/astra_camera_msgs/rosidl_adapter/astra_camera_msgs.idls) returned error code 1: AttributeError processing template 'msg.idl.em' Traceback (most recent call last): File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/resource/__init__.py", line 51, in evaluate_template em.BUFFERED_OPT: True, AttributeError: module 'em' has no attribute 'BUFFERED_OPT' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/miniconda3/lib/python3.9/runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "/usr/local/miniconda3/lib/python3.9/runpy.py", line 87, in _run_code exec(code, run_globals) File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/__main__.py", line 19, in <module> sys.exit(main()) File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/main.py", line 53, in main abs_idl_file = convert_to_idl( File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/__init__.py", line 19, in convert_to_idl return convert_msg_to_idl( File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/msg/__init__.py", line 39, in convert_msg_to_idl expand_template('msg.idl.em', data, output_file, encoding='iso-8859-1') File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/resource/__init__.py", line 23, in expand_template content = evaluate_template(template_name, data) File "/opt/ros/humble/local/lib/python3.10/dist-packages/rosidl_adapter/resource/__init__.py", line 69, in evaluate_template _interpreter.shutdown() AttributeError: 'NoneType' object has no attribute 'shutdown' Call Stack (most recent call first): /opt/ros/humble/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:130 (rosidl_adapt_interfaces) CMakeLists.txt:17 (rosidl_generate_interfaces) --- Failed <<< astra_camera_msgs [3.83s, exited with code 1] Summary: 0 packages finished [4.53s] 1 package failed: astra_camera_msgs 1 package had stderr output: astra_camera_msgs 1 package not processed