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 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
python文件特定行插入和替换实例详解
Jul 12 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
学习python可以干什么
Feb 26 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
Python如何读写CSV文件
Aug 13 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 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+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
php中的登陆login实例代码
2016/06/20 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
vue-devtools的安装步骤
2018/04/23 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
python爬虫工具例举说明
2020/11/30 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
写出一个方法实现冒泡排序
2016/07/08 面试题
工作求职信
2014/07/04 职场文书
七夕活动策划方案
2014/08/16 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS