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 时间操作例子和时间格式化参数小结
Apr 24 Python
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
python打开url并按指定块读取网页内容的方法
Apr 29 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
解析python的局部变量和全局变量
Aug 15 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
用python写爬虫简单吗
Jul 28 Python
python 自动识别并连接串口的实现
Jan 19 Python
深度学习tensorflow基础mnist
Apr 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 默默经典版本
2009/08/04 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP实现的常规正则验证helper公共类完整实例
2017/04/27 PHP
PHP7内核之Reference详解
2019/03/14 PHP
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
JS回调函数深入理解
2019/10/16 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
《桥》教学反思
2014/04/09 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
庆七一主持词
2015/06/29 职场文书
初中生活随笔
2015/08/15 职场文书
Python基本数据类型之字符串str
2021/07/21 Python