Выполнение bash-скрипта из Qt, который выполняет скрипт из Octave в фоновом режиме - PullRequest
0 голосов
/ 25 сентября 2019

Я попытался создать приложение с графическим интерфейсом, которое, как я упоминал в заголовке, выполняет скрипты, возможно, не традиционным способом, но у меня нет никакой другой идеи, это работает в Ubuntu, но мне нужно то же самое в RasPberry.Основная проблема, которая у меня есть, заключается в том, что в Raspberry не работает тот же скрипт, Qt (нажатие кнопки) выполняет скрипт в Bash, который выполняет скрипт в октаве, используя команду octave --eval nameofscript.m В Ubuntu это работает, в Rasbian Stretch нет.Я попробовал этот скрипт в bash в raspberry без использования qt, и он работает.Это мой код, который работает в Ubuntu:

    void MainWindow::on_pushButton_clicked()
{

 QFile file ("/home/reg-ubu/build-testowy-Desktop-Debug/dane.txt");
    QProcess process;

file.open(QIODevice::ReadOnly);

 process.startDetached("/bin/sh", QStringList()<< "-c" << "bash skrypt.sh");
file.close();

}

То же самое, что я использую в raspbian.Я заметил, что когда я пишу тот же код в raspbian Qt, он говорит, что skrypt.sh не существует, хотя он находится в том же каталоге, что и другие файлы проекта.Даже если я написал точно такой же путь к skrypt.sh, он говорит, что мой скрипт из октавы не определен в octave --eval nameofscript.Даже когда я попытался добавить точно такой же путь в этом месте, он будет работать без проблем, но я не вижу новые данные в файле.Сценарий из октавы очень прост:

s =55
plik = fopen('dane.txt','w');
fprintf(plik,'%d\n',s);
fclose(plik);

Это только для тестирования, если он работает.Подводить итоги.Это должно работать следующим образом: нажатие кнопки приложения Qt -> запускает скрипт bash, который запускает скрипт octave, который отправляет данные в dane.txt. Я пробовал другие способы выполнения скрипта таким образом, но ничего не работает, кроме того, что я упомянул.

1 Ответ

0 голосов
/ 25 сентября 2019

Я создал небольшой тест на своем ноутбуке Debian Stretch, и ваш скрипт работает.Мне пришлось добавить некоторые корректировки, чтобы остановить Octave.Убедитесь, что скрипт исполняется с chmod +x script.sh, и вы называете скрипт как ./script.sh.Последнее, безусловно, ваша проблема.

Попробуйте следующий код, если у вас есть сомнения, я сделал вам самую маленькую программу: p

script.sh

#! /usr/bin/octave
s = 55
plik = fopen('dane.txt','w');
fprintf(plik,'%d\n',s);
fclose(plik);
exit

main.cpp

#include <QApplication>
#include <QWidget>
#include <QProcess>
#include <QPushButton>
#include <QHBoxLayout>
#include <QStringList>
#include <iostream>

const char * my_script = "./script.sh";
int main(int argc, char *argv[]) {
        QApplication a(argc, argv);

        QSize size(80, 25);

        QHBoxLayout layout;
        QWidget window;
        layout.addWidget(&window);

        window.setMinimumSize(size);
        window.setMaximumSize(size);

        QPushButton start;
        start.setText("RUN");
        start.setParent(&window);

        start.connect(&start, &QPushButton::clicked, [] {
                std::cout << "Start process" << std::endl;
                QProcess proc;
                proc.startDetached("/bin/bash", QStringList() << "-c" << my_script);
                proc.waitForReadyRead(-1);
                proc.close();
        });

        window.show();
        return a.exec();
}

proc.pro

QT += core gui widgets
#QT += multimedia

CONFIG += c++17

TARGET = proc
CONFIG += console
CONFIG -= app_bundle

QMAKE_CFLAGS += -g -std=gnu++1z
QMAKE_LFLAGS += -lcurl

SOURCES += main.cpp
DEFINES += QT_DEPRECATED_WARNINGS
FORMS +=
...