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使用xmlrpc实例讲解
Dec 17 Python
Python批量转换文件编码格式
May 17 Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 Python
PyQt5 pyqt多线程操作入门
May 05 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
python中的Elasticsearch操作汇总
Oct 30 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
基于python爬取有道翻译过程图解
Mar 31 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 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
如何开发一个虚拟域名系统
2006/10/09 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
js电话号码验证方法
2015/09/28 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
python 图片验证码代码分享
2012/07/04 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python如何将字符串转换为日期
2020/07/31 Python
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
护理实习自我鉴定
2013/12/14 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
爱心募捐感谢信
2015/01/22 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP