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实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
用Python中的字典来处理索引统计的方法
May 05 Python
python简单实现获取当前时间
Aug 27 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
用python实现的线程池实例代码
Jan 06 Python
django做form表单的数据验证过程详解
Jul 26 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 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
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
Javascript typeof 用法
2008/12/28 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
深入理解Django的自定义过滤器
2017/10/17 Python
python3字符串操作总结
2019/07/24 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
python如何将图片转换素描画
2020/09/08 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
C语言编程题
2015/03/09 面试题
留学自荐信
2013/10/10 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
办理收楼委托书范本
2014/10/09 职场文书
2015员工年度考核评语
2015/03/25 职场文书
PHP解决高并发问题
2021/04/01 PHP
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js