ROS系统将python包编译为可执行文件的简单步骤


Posted in Python onJuly 25, 2021

python install模式开发规则

本文章讲述ROS系统下如何将python编译为可以执行文件,步骤比较简单,请严格执行避免疏漏

1.下载必须文件

git clone https://gitee.com/alen2020/ros_python_install_mode_files
##取该目录下的cmake目录和setup.py,install.sh到自己节点的目录
cp -r cmake setup.py  car_mqtt_api/

如果用到动态参数,还需要拷贝install.sh,并做下列修改(若如需用到动态参数,则以下请忽略)

cp install.sh  car_mqtt_api/

##需要修改install.sh下的package_name,修改为当前包名

package_name=
package_path=`rospack find ${package_name}`
if [ $# -eq 1 ]; then
    package_path=$1
fi
#注意默认认为.py文件放到src目录下,如果放到scripts下,需要改为scripts 
#我默认ROS工作空间的前缀目录为/root/ROS/catkin_ws/ ,如不是则请修改
mkdir $package_path/src/$package_name/cfg
cp  /root/ROS/catkin_ws/devel/lib/python2.7/dist-packages/$package_name/cfg/* $package_path/src/$package_name/cfg

2.改造目录结构

##原结构,.py文件应放在scripts文件夹下
ls

ROS系统将python包编译为可执行文件的简单步骤

主函数留在当前目录,被调用文件放到子目录,子目录同本包名

ROS系统将python包编译为可执行文件的简单步骤

3.创建CMakelist规则(有引用关系)

1) 修改当前包下的CMakelist
增加如下内容,其中add_subdirectory根据自己python文件存放的目录调整

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
# include CMake module for Cython
include(UseCython)
add_custom_target(ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P
  ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ReplicatePythonSourceTree.cmake
  ${CMAKE_CURRENT_BINARY_DIR}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(src)

##如果用到动态调参,需要另加上下面语句
add_custom_target(install.sh ALL)

add_custom_command(TARGET install.sh
POST_BUILD
COMMAND /bin/sh ${PROJECT_SOURCE_DIR}/install.sh ${PROJECT_SOURCE_DIR})
)

2) 在scripts目录下添加CMakeLists.txt
每一个被引用的文件都要写进去,注意结尾要写主函数的文件名

##添加子目录
add_subdirectory(mypackage)

cython_add_standalone_executable(1 MAIN_MODULE 1.py mypackage/2.py 1.py)
install(TARGETS 1
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

3) 在scripts目录的子目录下添加CMakeLists.txt
所有被引用的文件都需要添加规则

cython_add_module(2 2.py)
set_target_properties(2
  PROPERTIES
  LIBRARY_OUTPUT_DIRECTORY
  ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})
install(TARGETS 2
  LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION})
省略以下。。。

4.非引用关系(单文件)

写两次

cython_add_standalone_executable(car_mqtt_api_main MAIN_MODULE car_mqtt_api_main.py car_mqtt_api_main.py)

install(TARGETS car_mqtt_api_main
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

5. 如何引用包

改规则后需要加上子目录前缀

原
from mypackage import 2
改后
from mypackage.2 import function

6.cfg动态调参

前面说了子目录要与本节点同名,因为编译后并不会以子目录的名称命名,而是以节点名命名,编译生成的可执行文件会放到devel或install的lib/python2.7/dist-packages下,而以源码模式运行则会读取子目录下的cfg文件

如car_mqtt_api编译后动态调参的可执行程序放到如下目录

devel/lib/python2.7/dist-packages/mypackage/cfg

此时需要将该目录下的文件copy到子目录

mkdir -p mypackage/scritps/cfg
cp */devel/lib/python2.7/dist-packages/mypackage/cfg scripts/mypackage/cfg

7.常见bug

找不到模块:在install/lib/python2.7/dist-packages/car_control目录下放置__init__.py文件

到此这篇关于ROS系统将python包编译为可执行文件的文章就介绍到这了,更多相关python包编译为可执行文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
解决Python传递中文参数的问题
Aug 04 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
Python的装饰器使用详解
Jun 26 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
python实现图片插入文字
Nov 26 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
详解Python函数print用法
Jun 18 Python
Django框架中视图的用法
Jun 10 Python
Pandas自定义选项option设置
Jul 25 #Python
Pandas 稀疏数据结构的实现
Jul 25 #Python
Python中rapidjson参数校验实现
Jul 25 #Python
理解python中装饰器的作用
Jul 21 #Python
opencv检测动态物体的实现
Python爬虫中urllib3与urllib的区别是什么
python Django框架快速入门教程(后台管理)
You might like
php+mysql查询优化简单实例
2015/01/13 PHP
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
判断JS对象是否拥有某属性的方法推荐
2016/05/12 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
Angular工具方法学习
2016/12/26 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
Vue中的vue-resource示例详解
2018/11/02 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
python实现邮件循环自动发件功能
2020/09/11 Python
python实现双人五子棋(终端版)
2020/12/30 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
学校司机岗位职责
2013/11/14 职场文书
周年庆典答谢词
2015/01/20 职场文书
八年级作文之友情
2019/11/25 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
Python中的xlrd模块使用整理
2021/06/15 Python