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文件夹与文件的操作实现代码
Jul 13 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
Python实现多线程抓取妹子图
Aug 08 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python实现随机梯度下降法
Mar 24 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
用Python远程登陆服务器的步骤
Apr 16 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 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切割页面div内容的实现代码分享
2012/07/31 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
django迁移数据库错误问题解决
2019/07/29 Python
python操作cfg配置文件方式
2019/12/22 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
骨干教师培训制度
2014/01/13 职场文书
服务员岗位职责
2014/01/29 职场文书
客服部工作职责范本
2014/02/14 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
期中考试反思800字
2014/05/01 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
工作检讨书范文
2015/01/23 职场文书
教师考核鉴定意见
2015/06/05 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书