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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python数据类型详解(四)字典:dict
May 12 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
对Python中的@classmethod用法详解
Apr 21 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
Python并发:多线程与多进程的详解
Jan 24 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
Jul 23 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
Python torch.flatten()函数案例详解
Aug 30 Python
深入理解pytorch库的dockerfile
Jun 10 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
yii的CURD操作实例详解
2014/12/04 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python数据集切分实例
2018/12/08 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
python中wx模块的具体使用方法
2020/05/15 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
python实现学生成绩测评系统
2020/06/22 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
先进集体获奖感言
2014/02/13 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang