ROS报错:“ImportError: dynamic module does not define module export function (PyInit__tf2)”的原因及解决办法

本文讲述了在使用Python3.8编写ROS代码时遇到的tf包导入错误,原因在于tf2针对python2.7编译。解决办法是下载tf2源码,针对python3编译,并在Anaconda环境下创建虚拟环境并安装所需包。最后,需设置环境变量并验证tf2包在python3中的可用性。
部署运行你感兴趣的模型镜像

问题描述

作者目前正在使用Python3.8编写一个ROS代码,代码需要使用到tf包。当我们import tf并运行代码时,控制台给出了如下报错:

>>> import tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf/__init__.py", line 28, in <module>
    from tf2_ros import TransformException as Exception, ConnectivityException, LookupException, ExtrapolationException
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_ros/__init__.py", line 38, in <module>
    from tf2_py import *
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_py/__init__.py", line 38, in <module>
    from ._tf2 import *
ImportError: dynamic module does not define module export function (PyInit__tf2)

问题原因

从上文的报错信息不难看出,报错信息皆指向了python2.7文件夹,这是因为tf2是面向python2.7进行编写的,而作者使用的解释器版本为python3.8,因此由于版本不对应所以产生了上述问题

解决问题

软件与硬件

以下为作者解决问题所基于的各种软件与硬件信息:
操作系统:Ubuntu16.04
ROS版本:Kinetic
Python版本:3.8
环境管理:Anaconda
CPU:i7-12700f
GPU:RTX 4060Ti

解决思路

ROS自带的tf2使用python2.7对源码进行编译,而我们需要的是使用python3进行编译的tf2,因此可以从github上下载tf2对应的源码,并通过指定编译器的方式来make出一个适用于python3的tf包。

解决方法

  1. Anaconda创建虚拟环境
conda create --name py36 python=3.6
# 这里的python版本原则上不影响后续操作
  1. 为Anaconda环境安装指定的包,这些包在catkin_make时将会被使用
pip install numpy
pip install empy
pip install pyyaml
  1. 新建一个工作空间(推荐位置在主目录下,名字随便起)
mkdir -p tf/src
cd tf/src
  1. 在src文件夹内克隆编译tf2所需的源码(geometry,geometry2)
git clone https://github.com/ros/geometry
git clone https://github.com/ros/geometry2

如果克隆报错的话,直接去网站下载压缩包并解压到src目录下亦可

  1. 返回tf目录下,并进行自定义catkin_make
catkin_make --cmake-args \
            -DCMAKE_BUILD_TYPE=Release \
            -DPYTHON_EXECUTABLE=/usr/bin/python3 \
            -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m \
            -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so

需要注意的是,上面三个链接一定要仔细核对,大家可以根据链接的指引去文件夹内查看,网上有些教程使用的是python3.6m,而作者电脑中只有python3.5m,因此链接内容的填写一定要根据电脑的实际情况。
在确保链接无误后,上面的指令可以全部复制并执行。
在这里插入图片描述若编译未产生报错,则说明python3可用的tf2包创建成功

可行性验证

当我们需要在python3环境中使用tf2包时,在程序运行前还需要在终端source一下新建立tf包的位置

source /home/xxx/tf/devel/setup.bash

具体链接根据自己安装的位置而定,如果想一劳永逸,也可以将指令添加到.bashrc文件下。

此后,我们可以在控制台临时启动一个python3并import tf,看是否有报错:

>>> import tf
>>>

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在TensorFlow运行过程中,遇到CUDA动态库加载失败和Keras模块导入错误是较为常见的问题,解决这些问题通常需要从环境配置、依赖库版本以及代码导入方式入手。 ### CUDA动态库加载失败的解决方法 1. **确认CUDA和cuDNN版本是否兼容TensorFlow版本**。TensorFlow对CUDA和cuDNN的版本有严格要求,例如TensorFlow 2.x通常需要CUDA 11.x和cuDNN 8.x。如果使用的是旧版本TensorFlow(如1.x),可能需要CUDA 10.x或更低版本[^2]。 2. **安装正确的NVIDIA驱动**。确保NVIDIA驱动版本与CUDA Toolkit兼容,可以通过NVIDIA官方网站查询并安装最新的驱动。 3. **设置环境变量**。确保CUDA的bin目录(如`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin`)已添加到系统的`PATH`环境变量中。 4. **验证TensorFlow是否正确识别GPU**。可以运行以下代码检查TensorFlow是否成功加载GPU支持: ```python import tensorflow as tf print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU'))) ``` ### Keras模块导入错误的解决方法 1. **区分TensorFlow内部的Keras与独立Keras库**。在TensorFlow 2.x中,Keras已经被集成到`tf.keras`中,因此导入方式应为: ```python from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Conv2D, GlobalAveragePooling2D, Dropout from tensorflow.keras.layers import Activation, BatchNormalization, Add, Reshape, DepthwiseConv2D from tensorflow.keras.utils import plot_model ``` 如果仍然使用`from keras.models import Model`,则需要安装独立的Keras库,并确保其与TensorFlow版本兼容[^1]。 2. **更新TensorFlow和Keras**。确保使用的是最新版本的TensorFlow和Keras,以避免已知的导入问题。可以通过以下命令更新: ```bash pip install --upgrade tensorflow pip install --upgrade keras ``` 3. **检查`pydot`和`graphviz`是否安装**。`plot_model`功能依赖于`pydot`和`graphviz`,如果未安装,会导致导入错误。可以通过以下命令安装: ```bash pip install pydot pip install graphviz ``` ### 示例代码:正确导入并使用`plot_model` ```python from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Conv2D, GlobalAveragePooling2D, Dropout from tensorflow.keras.layers import Activation, BatchNormalization, Add, Reshape, DepthwiseConv2D from tensorflow.keras.utils import plot_model def create_model(): inputs = Input(shape=(224, 224, 3)) x = Conv2D(32, (3, 3), strides=(2, 2), padding='same')(inputs) x = BatchNormalization()(x) x = Activation('relu')(x) x = GlobalAveragePooling2D()(x) x = Dropout(0.5)(x) outputs = Dense(1, activation='sigmoid')(x) model = Model(inputs, outputs) return model model = create_model() plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值