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中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
基于hashlib模块--加密(详解)
Jun 21 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
python+opencv实现动态物体追踪
Jan 09 Python
对python添加模块路径的三种方法总结
Oct 16 Python
python 画函数曲线示例
Dec 04 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
Python中Permission denied的解决方案
Apr 02 Python
python实现腾讯滑块验证码识别
Apr 27 Python
python内置模块之上下文管理contextlib
Jun 14 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在服务器执行exec命令失败的解决方法
2012/03/03 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP速成大法
2015/01/30 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
javascript自执行函数
2017/02/10 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
详解python中的 is 操作符
2017/12/26 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
有针对性的求职自荐信
2013/11/14 职场文书
元旦促销方案
2014/03/15 职场文书
小学三年级学生评语
2014/04/22 职场文书
新手上路标语
2014/06/20 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
python读取mnist数据集方法案例详解
2021/09/04 Python
Rust中的Struct使用示例详解
2022/08/14 Javascript