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实现bitmap数据结构详解
Feb 17 Python
使用Python获取Linux系统的各种信息
Jul 10 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 Python
Python3中FuzzyWuzzy库实例用法
Nov 18 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 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 ajax 分页类代码
2008/11/13 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
Python内置函数及功能简介汇总
2020/10/13 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
产品质量承诺书
2014/03/27 职场文书
母校寄语大全
2014/04/10 职场文书
软件售后服务方案
2014/05/29 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
2014年环卫工作总结
2014/11/22 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
python某漫画app逆向
2021/03/31 Python
Vue3.0 手写放大镜效果
2021/07/25 Vue.js