ReHooksDR与C++组件一起导出Python脚本

2024-09-30 01:22:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个C++Redhawk组件,我需要对python脚本执行system调用。 此脚本需要与组件一起部署。在

有没有一种方法可以使这个脚本或任何数据文件成为一个依赖项,以便它与组件一起导出到$SDRROOT?在


Tags: 方法脚本数据文件部署组件systemredhawksdrroot
1条回答
网友
1楼 · 发布于 2024-09-30 01:22:35

让我们来看看一个小例子。在本例中,我们使用RedHawk1.10,尽管1.8、1.9和2.0应该是相似的。我们有一个C++组件,叫做HeloRelppython,它将有一个Service函数,它除了调用一个名为Python的脚本之外什么也不做。地狱世界.py“你好,世界!在

<>在IDE中创建和生成C++组件。接下来我们需要创建地狱世界.py编写脚本并将其放入cpp文件夹中。我得到的是:

$ cat HelloWorldPython/cpp/HelloWorld.py 
#!/bin/env python
print "Hello World"

现在我们需要将这个文件通知两个实体,一个是用于构建和安装组件的构建系统(autotools)和REDHAWK框架,这样当它将组件部署到一个节点时,它会复制这个脚本和可执行文件。在

修改生成文件.am并添加:

^{pr2}$

就在定义dist_xml_数据行的下面。这将告诉生成系统安装地狱世界.py在上面定义的bin目录中的文件。请注意,添加此项后,您需要重新运行./reconf和./configure才能使更改生效。在

现在我们需要告诉REDHAWK域管理员关于脚本的事情。当组件以波形形式启动时,域管理器将文件/文件夹复制到节点上。在节点上执行的是这个副本,而不是$SDRROOT/dom/components中的副本。告诉域管理器要复制什么的字段是SPD文件的“localfile”标记。你可以改变HelloWorldPython.spd.xml直接或从SPD编辑器中使用IDE的implementations选项卡,代码部分的“File”文本框。无论哪种情况,我们都需要将它从“cpp/HelloWorldPython”更改为“cpp”,后者是包含可执行文件和python脚本的文件夹。在

最后,我把我的组件代码放在下面。这也许不是最好的办法,但它证明了这个想法。Iused the proc file system to get the full path to the executing binary,然后使用boost的stringreplace将组件名替换为python文件。这样做是为了让我可以指定python脚本的完整路径,该脚本是通过域管理器而不是sdroot中的路径。如果这是一个带有远程节点的多机系统,那么远程节点上的sdroot可能没有$SDRROOT/dom/components中的组件。在

#include "HelloWorldPython.h"
#include <iostream>
#include <unistd.h>
#include <boost/algorithm/string/replace.hpp>
#include <stdlib.h>
PREPARE_LOGGING(HelloWorldPython_i)
HelloWorldPython_i::HelloWorldPython_i(const char *uuid, const char *label) : HelloWorldPython_base(uuid, label) {}
HelloWorldPython_i::~HelloWorldPython_i() {}
void HelloWorldPython_i::constructor() {}
int HelloWorldPython_i::serviceFunction()
{
    #define BUFSIZE 256
    char locationBuffer[BUFSIZE] = {0};
    readlink("/proc/self/exe", locationBuffer, BUFSIZE);
    std::string location(locationBuffer);
    boost::replace_last(location, "HelloWorldPython", "HelloWorld.py");
    std::string command = "python " + location;
    system(command.c_str());
    return FINISH;
}

编辑

jdclfc指出了两个问题:

I think that there are side effects to changing the Code section's 'localfile' tag. After changing the 'localfile' tag, the component doesn't launch in the sandbox anymore.

感谢您指出这一点,看起来好像是following line的问题。ATTR_PROGRAM_NAME应该设置为入口点,而不是本地文件。这应该在将来的版本中修复。只有当组件驻留在工作区中时,才会执行此代码路径。要解决此错误,请将组件安装到SDRROOT中。然后,从黑板托盘,将组件从“组件”部分而不是“工作区”部分启动到沙盒中。在

Also the export command exports all source code to $SDRROOT/dom/components

对于2.0.0之前的IDE版本,这是正确的。而不是使用建筑.shinstall“或”makeinstall“命令行命令、将组件从工作区拖放到SDRROOT,或者使用导出向导,都会尝试根据localfile参数来决定部署什么。在2.0版本中,IDE使用现有的建筑.sh/生成安装方法。正如您所指出的,这些额外的文件并没有什么坏处,但是如果您想解决这个问题,您可以使用从命令行安装组件/建筑.sh安装或使安装。如果您想将该行为绑定到IDE中,可以重写默认的构建命令以包含安装步骤。为此,您可以右键单击有问题的项目,选择properties。然后选择C/C++构建部分和行为标签。对于构建,而不是“全部”,您可以将其更改为“安装”。现在,当IDE构建您的组件时,它还将把它(sans source)安装到sdroot中。但是,您需要单击SDRROOT并点击F5或右键单击并选择refresh。在

相关问题 更多 >

    热门问题