# 5.Python依赖查找流程 python的打包和引入依赖的方式相比C++要容易太多。本节小鱼带你来通过几个实例学习下Python的路径查找机制。 ## 1.编写ROS2的Python节点 在`d2lros2/d2lros2/chapt2/basic`新建`second_ros2_node.py`,输入下面的内容 ```python # 导入rclpy库,如果Vscode显示红色的波浪线也没关系 # 我们只是把VsCode当记事本而已,谁会在意记事本对代码的看法呢,不是吗? import rclpy from rclpy.node import Node # 调用rclcpp的初始化函数 rclpy.init() # 调用rclcpp的循环运行我们创建的second_node节点 rclpy.spin(Node("second_node")) ``` ## 2.运行Python节点 打开终端,输入指令 ``` ls python3 second_ros2_node.py ``` 打开新的终端,输入 ```shell ros2 node list ``` ![image-20220603154952746](5.Python依赖查找流程/imgs/image-20220603154952746.png) 完美,四行代码写了个ROS2的Python节点。 那么问题来了,我们import rclpy,rclpy到底在哪里?python是如何找到的? ## 3.Python包查找流程 Python3运行`import rclpy`时候如何找到它的呢?答案是通过环境变量`PYTHONPATH` Ctrl+C打断节点运行,接着输入下面指令 ```shell echo $PYTHONPATH ``` 结果 ```python /opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages ``` 你会发现里面有关于humble的python路径,在上面两个目录下找一下rclpy,看看能不能找到rclpy 查找第一个路径 ``` ls -l /opt/ros/humble/lib/python3.10/site-packages | grep rclpy ``` 没找到,第二个 ``` ls -l /opt/ros/humble/local/lib/python3.10/dist-packages/ | grep rclpy ``` 找到了 ``` drwxr-xr-x 1 root root 4096 Jun 3 04:45 rclpy drwxr-xr-x 2 root root 4096 May 23 22:23 rclpy-3.3.4-py3.10.egg-info ``` ## 4.unset实验 使用`unset`指令可以将环境变量删除掉,尝试删除掉`PYTHONPATH`之后再运行代码,看看是否还可以导入`rclpy`。 ``` unset python3 second_ros2_node.py ``` 提示如下 ``` root@490925f19143:~/d2lros2/d2lros2/chapt2/basic# python3 second_ros2_node.py Traceback (most recent call last): File "/root/d2lros2/d2lros2/chapt2/basic/second_ros2_node.py", line 3, in import rclpy ModuleNotFoundError: No module named 'rclpy' ``` 请你记住这个报错信息`ModuleNotFoundError: No module named 'xxx'`,这也是你未来学习过程中可能会经常会遇到的。 下**次遇到时,你会想起小鱼这篇文章,然后对它轻蔑的一笑,接着找到这个库所在的目录,把它加到环境里。** ## 5.总结 本节小鱼带你学习了Python编写ROS2节点的方式,并带你认识了一个常见的错误`ModuleNotFoundError: No module named 'xxx'`。 --- 技术交流&&问题求助: - **微信公众号及交流群:鱼香ROS** - **小鱼微信:AiIotRobot** - **QQ交流群:139707339** - 版权保护:已加入“维权骑士”(rightknights.com)的版权保护计划