简单总结一下:python的py文件在ros中不能直接运行,所以需要编译为可执行文件,才能通过rosrun或者roslaunch执行,同时在该执行文件开头需要注明解释器(和编码规则)
而该可执行文件需要导入其他python模块时,通过解释器在搜索路径中读取,可直接读取py文件,一个python模块应该以包的形式规范编写
可执行文件和需要导入的包/文件:
若在同一目录,理论上搜索路径为同一层及,可不用添加setup.py
若不在同一目录,则需要用setup.py去声明python包。
如果依然找不到路径,说明可能搜索路径没有加入可执行文件的路径,需要在脚本中增加路径 sys.path.insert 或者在环境变量中添加 export PYTHONPATH=
首先,应该按照python包层级规范编写
ros编译规则:在功能包的根目录下添加setup.py文件,用于编译已有的python包
以在devel空间可以运行python包,或在功能包的bin目录下运行脚本可以找到src目录下的python包
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
d = generate_distutils_setup(
packages=['mypkg'],
scripts=['scripts/myscript'],
package_dir={'': 'src'}
)
setup(**d)
以及在CMakelists.txt文件添加可执行文件
install(PROGRAMS bin/hello
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
#可执行文为bin/hello
catkin_install_python(PROGRAMS
src/hello.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
))
#可执行文件为src/hello.py
以及在执行的脚本文件开头要加上指定解释器的文件
#! /usr/bin/env python
或者(取决于需要的解释器版本)
#! /usr/bin/env python3
python绝对导入的搜索路径一般有几种:
1.python自带的包路径与pip安装路径
2.解释器执行当前脚本的同级路径
3.系统环境变量
本次遇到问题即第2点异常,搜索路径没有添加当前路径,从而导致报错 no module
解决方法一:
在环境变量中添加路径
export PYTHONPATH=/home/xxx/xxx/src
解决方法二:
python脚本执行导入前先添加路径(推荐)
import sys
from os.path import abspath, join, dirname
sys.path.insert(0, join(abspath(dirname(__file__))))
(相对引用应该只能模块内使用,外部脚本不能直接使用相对引用)
(__all__ 定义可以指定从当前文件/包中引用 * 时,导出的类或者方法)