C++开发python扩展模块:ImportError: dynamic module does not define init function (initRabbit)解决办法

本文详细介绍了如何在C++中为Python编写动态链接库,并在Python中调用C++扩展功能函数时避免遇到'ImportError: dynamic module does not define init function'错误的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文首发地址:http://www.atolin.net/c%E5%BC%80%E5%8F%91python%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%EF%BC%9Aimporterror-dynamic-module-does-not-define-init-function-initrabbit%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/


用C++为Python编写扩展模块(动态链接库),并在Python中调用C++开发的扩展功能函数过程,遇到如下错误的童鞋,系不系很苦恼啊:

 ImportError: dynamic module does notdefine init function (initRabbit)

经过分析,原因是,没有正确导出封装python扩展模块所必需的init函数,正确的导出方法为:

#ifdef PYRABBIT_EXPORTS

#define PYRABBIT_API __declspec(dllexport)

#else

#define PYRABBIT __declspec(dllimport)

#endif

 

extern "C"  PYRABBIT_APIvoid initRabbit(){

    PyObject* m=Py_InitModule("Rabbit",RabbitMethods);

}

 

上面的initRabbit()函数的声明定义,是关键。是不是豁然开朗迎刃而解呢。

在你的错误信息中,ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost),这可能是由于ROS自带的cv_bridge只支持Python2而不是Python3导致的。为了解决这个问题,你需要编译一个适用于Python3的cv_bridge模块。 以下是解决方案: 1. 首先,确保你在系统的真实环境中操作,而不是在conda创建的虚拟环境中。打开一个新终端,并运行conda deactivate命令,确保退出所有虚拟环境。 2. 进入Python3环境并安装相关依赖包: ``` sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-melodic-cv-bridge ``` 注意,根据你使用的ROS版本可能会有略微不同的依赖包名称。 3. 创建一个工作空间用于存放待编译的cv_bridge文件: ``` mkdir -p catkin_ws_for_cvbridge/src ``` 4. 设置参数: ``` cd catkin_ws_for_cvbridge catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so ``` 注意,这里的参数根据你系统自带的Python版本进行设置,16.04使用Python3.5,18.04使用Python3.6。 5. 告诉catkin将构建的包安装到指定位置: ``` catkin config --install ``` 6. 在catkin_workspace工作空间中克隆cv_bridge: ``` git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv ``` 7. 查看适合的cv_bridge版本: ``` apt-cache show ros-melodic-cv-bridge | grep Version ``` 8. 编译cv_bridge: ``` catkin build cv_bridge ``` 如果一切顺利,应该能够成功编译cv_bridge模块。 9. 最后,确保你将编译后的cv_bridge包添加到ROS的环境变量中。 通过以上步骤,你应该能够解决ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在Python3环境中使用ROS的cv_bridge](https://download.youkuaiyun.com/download/weixin_38703794/14036198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【bug】ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)](https://blog.youkuaiyun.com/qq_36497369/article/details/128853820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值