Я создал C++
Компонент Redhawk и мне нужно сделать system
позвонить на python
скрипт.
Этот сценарий необходимо развернуть вместе с компонентом.
Есть ли способ сделать этот сценарий, или в этом отношении любой файл данных, зависимость, чтобы он был экспортирован в $SDRROOT
вместе с компонентом?
Давайте пройдемся по тривиальному примеру. В этом примере мы используем REDHAWK 1.10, хотя 1.8, 1.9 и 2.0 должны быть похожими. У нас есть компонент C ++ под названием HelloWorldPython, который будет иметь функцию serviceFunction, которая ничего не делает, кроме как вызывает скрипт python под названием «HelloWorld.py», который печатает Hello World!
Создайте и сгенерируйте компонент C ++ как обычно в среде IDE. Далее нам нужно создать скрипт HelloWorld.py и поместить его в папку cpp. Вот что у меня есть:
$ cat HelloWorldPython/cpp/HelloWorld.py
#!/bin/env python
print "Hello World"
Теперь нам нужно сообщить двум объектам этого файла: системе сборки, использованной для сборки и установки Компонента (автоинструмент), и инфраструктуре REDHAWK, чтобы при развертывании Компонента в Узле он копировал этот скрипт вместе с исполняемым файлом.
Измените Makefile.am и добавьте:
dist_bin_SCRIPTS = HelloWorld.py
Прямо под линией, определяющей dist_xml_DATA. Это скажет системе сборки установить файл HelloWorld.py в каталог bin, который определен выше. Обратите внимание, что после добавления этого вам нужно будет повторно запустить ./reconf и ./configure, чтобы изменения вступили в силу.
Теперь нам нужно рассказать администратору домена REDHAWK о скрипте. Когда Компонент запускается в Waveform, Менеджер домена копирует файл / папку на Узел. Именно эта копия выполняется на узле, а не в $ SDRROOT / dom / components. Поле, которое сообщает менеджеру домена, что копировать, является тегом «localfile» файла SPD. Вы можете либо изменить HelloWorldPython.spd.xml напрямую, либо использовать вкладку реализаций IDE, текстовое поле «Файл» в разделе кода из редактора SPD. В любом случае нам нужно изменить его с «cpp / HelloWorldPython», который был просто исполняемым, на «cpp», который является папкой, которая содержит как исполняемый файл, так и скрипт python.
Наконец, я разместил свой код компонента ниже. Возможно, это не лучший способ сделать это, но это подтверждает идею. я использовал файловую систему proc, чтобы получить полный путь к исполняемому двоичному файлу, затем использовал строку замены boost для замены имени компонента файлом python. Это было сделано для того, чтобы я мог указать полный путь к скрипту python, который был развернут с помощью диспетчера домена, а не через SDRROOT. Если это была многопользовательская система с удаленными узлами, SDRROOT на удаленном узле может не иметь компонента в $ 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 Выделены две проблемы:
Я думаю, что есть побочные эффекты при изменении тега раздела «localfile» раздела. После изменения тега «localfile» компонент больше не запускается в песочнице.
Спасибо за указание на это, похоже, что это проблема с следующая строка. Для ATTR_PROGRAM_NAME должна быть указана точка входа, а не локальный файл. Это должно быть исправлено в будущем выпуске. Этот путь к коду выполняется только в том случае, если компонент находится в вашей рабочей области. Чтобы обойти эту ошибку, установите компонент в SDRROOT. Затем из поддона классной доски запустите компонент в «песочницу» из раздела «Компоненты», а не из раздела «Рабочая область».
Также команда export экспортирует весь исходный код в $ SDRROOT / dom / components
Это верно для версий IDE до 2.0.0. Вместо использования команд командной строки «build.sh install» или «make install» перетаскивание компонента из рабочей области в SDRROOT или использование мастера экспорта попытается определить, что развертывать на основе частично по параметру localfile. В версии 2.0 в среде IDE используются существующие методы build.sh / make install. Как вы указали, дополнительные файлы не причиняют вреда, однако, если вы хотите обойти это, вы можете установить компонент из командной строки, используя ./build.sh install или make install. Если вы хотите связать это поведение с IDE, вы можете переопределить команду сборки по умолчанию, включив в нее этап установки. Для этого вы должны щелкнуть правой кнопкой мыши по рассматриваемому проекту, выбрать свойства. Затем выберите раздел «Сборка C / C ++» и вкладку «Поведение». Для Build вместо «all» вы можете изменить это на «install». Теперь, когда IDE создаст ваш компонент, он также установит его (без исходного кода) в SDRROOT. Однако вам нужно будет нажать на SDRROOT и нажать F5 или щелкнуть правой кнопкой мыши и выбрать обновление.
Других решений пока нет …