报错如下:
qizerone@qizerone-virtual-machine:~/Documents/STM32$ rosrun rosserial_stm32 make_libraries.py . [rosrun] You have chosen a non-unique executable, please pick one of the following: 1) /home/qizerone/catkin_stm32_ws/devel/share/rosserial_stm32/make_libraries.py 2) /home/qizerone/catkin_stm32_ws/src/rosserial_stm32/src/rosserial_stm32/make_libraries.py #? 2 Exporting to . Traceback (most recent call last): File "/home/qizerone/catkin_stm32_ws/src/rosserial_stm32/src/rosserial_stm32/make_libraries.py", line 90, in <module> shutil.copy(rosserial_stm32_dir+"/src/ros_lib/"+f, path+"/Inc/") File "/usr/lib/python3.8/shutil.py", line 418, in copy copyfile(src, dst, follow_symlinks=follow_symlinks) File "/usr/lib/python3.8/shutil.py", line 264, in copyfile with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst: IsADirectoryError: [Errno 21] Is a directory: './Inc/
1、遇错情况
注:遇到这问题是在笔者使用rosserial_stm32尝试使stm32和ros建立通讯。在运行make_libraries.py时报错
命令如下:
rosrun rosserial_stm32 make_libraries.py .
报错如下:
qizerone@qizerone-virtual-machine:~/Documents/STM32$ rosrun rosserial_stm32 make_libraries.py .
[rosrun] You have chosen a non-unique executable, please pick one of the following:
1) /home/qizerone/catkin_stm32_ws/devel/share/rosserial_stm32/make_libraries.py
2) /home/qizerone/catkin_stm32_ws/src/rosserial_stm32/src/rosserial_stm32/make_libraries.py
#? 2
Exporting to .
Traceback (most recent call last):
File "/home/qizerone/catkin_stm32_ws/src/rosserial_stm32/src/rosserial_stm32/make_libraries.py", line 90, in <module>
shutil.copy(rosserial_stm32_dir+"/src/ros_lib/"+f, path+"/Inc/")
File "/usr/lib/python3.8/shutil.py", line 418, in copy
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/usr/lib/python3.8/shutil.py", line 264, in copyfile
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: './Inc/
2、解决思路:
报错原因是因为在make_libraries.py中shutil.copy(rosserial_stm32_dir+"/src/ros_lib/"+f, path+"/Inc/")
:这是导致错误的代码行。在这行代码中,脚本试图使用shutil.copy
函数复制文件。它的参数应该是一个文件的路径,代码运行时需要直接寻找到ros_lib.txt来替换掉它的内容。但是在刚使用rosserial_stm32时,是没有在"/Inc/"下是没有ros_lib.txt文件的。所以需要我们自己修改代码创建ros_lib.txt的。
3、解决方案:
1、编辑make_libraries.py文件。
sudo gedit /home/qizerone/catkin_stm32_ws/src/rosserial_stm32/src/rosserial_stm32/make_libraries.py
自己改错的话,需要自己更改为你的路径。
2、创建原始文件路径和目标文件路径,判断并创建目标文件
添加代码如下:
source_file = "ros_lib.txt" # 原始文件的路径
target_file = "./Inc/ros_lib.txt" # 目标文件的路径
os.makedirs(os.path.dirname(target_file), exist_ok=True)#判断文件目标是否存在
3、至此问题解决,make_libraries.py且能正常运行。