【问题标题】:Executing bash script from Qt which executes script from Octave in background从 Qt 执行 bash 脚本,该脚本在后台从 Octave 执行脚本
【发布时间】:2019-09-25 18:38:02
【问题描述】:

我尝试制作一个 gui 应用程序,正如我在标题中提到的那样,它以可能不是传统的方式执行脚本,但我没有任何其他想法,它可以在 ubuntu 中运行,但我在 raspberry 中需要相同的方式。我遇到的主要问题是,在覆盆子中,相同的脚本不起作用,Qt(按钮单击)在bash中执行脚本,该脚本使用命令octave --eval nameofscript.m在八度音阶中执行脚本在ubuntu中这有效,而在raspbian中则无效。我在没有使用 qt 的情况下在 bash 中尝试了这个脚本,它可以工作。这是我在 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 的脚本在octave --eval nameofscript 中未定义。即使我尝试在这个地方添加完全相同的路径,它也会毫无问题地运行,但我在文件中看不到新数据。 octave 的脚本非常简单:

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

它仅用于测试它是否工作。 总结一下。它应该以这种方式工作: Qt 应用程序按钮单击 -> 运行 bash 脚本,该脚本运行 octave 脚本,将数据发送到 dane.txt 我尝试了以这种方式执行脚本的其他方法,但没有什么比我提到的更有效。

【问题讨论】:

    标签: bash qt raspbian


    【解决方案1】:

    我在我的 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
    

    ma​​in.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 +=
    

    【讨论】: