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和shell变量互相传递的几种方法
Nov 20 Python
Python入门篇之面向对象
Oct 20 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
Jun 27 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
解决python 文本过滤和清理问题
Aug 28 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
利用Python如何实时检测自身内存占用
May 09 Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 Python
python 密码学示例——理解哈希(Hash)算法
Sep 21 Python
教你怎么用Python操作MySql数据库
May 31 Python
Python中异常处理用法
Nov 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
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
Python中的高级函数map/reduce使用实例
2015/04/13 Python
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
init进程的作用
2015/08/20 面试题
庆元旦广播稿
2014/02/10 职场文书
房屋出租协议书
2014/04/10 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
教师求职信范文
2014/05/24 职场文书
车间统计员岗位职责
2015/04/14 职场文书
小学见习报告
2015/06/23 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js