Warm tip: This article is reproduced from serverfault.com, please click

Why import works in this ROS python script

发布于 2020-11-24 14:11:43

I am working with ROS packages and coming from this tutorial. This import statement surprisingly works given the absence of AddTwoIntsResponse anywhere in the current working directory or any other directory listed in PATH. Also how come a .srv gets imported?

# add_two_ints_server.py
from beginner_tutorials.srv import AddTwoInts, AddTwoIntsResponse 

The current working directory is ~/catkin_ws/src/beginner_tutorials/srv

This is my ROS directory layout:

catkin_ws
|-- src
|   `-- beginner_tutorials
|       |-- scripts
|       |   `-- add_two_ints_server.py
|       `-- srv
|           `-- AddTwoInts.srv
|-- build
`-- devel

The contents of AddTwoInts.srv are:

int64 a
int64 b
---
int64 sum

According to my understanding this should throw an ImportError: cannot import name 'AddTwoIntsResponse', but it doesn't. Importing any other file say: from beginner_tutorials.srv import foo throws an ImportError.

Where is my understanding going wrong?

Questioner
maddypie
Viewed
1
Kashish Goyal 2020-12-01 00:04:02
|-- src
|   `-- beginner_tutorials
|       |-- scripts
|       |   `-- add_two_ints_server.py
|       `-- srv
|           `-- AddTwoInts.srv
|-- build
|-- devel // this is where your modules are imported from

When you build the package using catkin_make, 'catkin` generates the relevant python files for your service type defined in .srv file and puts them under catkin_ws/devel/lib/your-python-version/dist-packages/package-name/srv.

If your workspace is sourced, catkin_ws/devel/lib/your-python-version/dist-packages/ is already added to your PYTHONPATH and that is how you are able to import them successfully.

In case of the tutorial package that you are using, imports may work even when you haven't sourced your current catkin-directory, if you have the binaries of the tutorials installed. This way the python modules reside under /opt/ros/ros-version/lib/your-python-version/dist-packages/ and that is again part of the PYTHONPATH. (If ROS env is available)