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程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python使用shelve模块实现简单数据存储的方法
May 20 Python
利用python批量给云主机配置安全组的方法教程
Jun 21 Python
python中关于for循环的碎碎念
Jun 30 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Java分治归并排序算法实例详解
Dec 12 Python
如何使用Python实现自动化水军评论
Jun 26 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
Python实现像awk一样分割字符串
Sep 15 Python
selenium自动化测试入门实战
Dec 21 Python
Python的collections模块真的很好用
Mar 01 Python
Python如何让字典保持有序排列
Apr 29 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第三方登录―QQ登录实现方法
2017/02/06 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
Python中bisect的用法
2014/09/23 Python
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python 正则表达式(转义问题)
2014/12/15 Python
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
Python3.6正式版新特性预览
2016/12/15 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
虚拟机下载python是否需要联网
2020/07/27 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
什么造成了Java里面的异常
2016/04/24 面试题
小学生国庆节演讲稿
2014/09/05 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
同学会演讲稿
2019/04/02 职场文书
Django如何与Ajax交互
2021/04/29 Python
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python