QProcess 无法启动进程:未找到进程

Posted

技术标签:

【中文标题】QProcess 无法启动进程:未找到进程【英文标题】:QProcess fails to start a process : no process found 【发布时间】:2020-06-04 20:36:25 【问题描述】:

我正在使用QProcess 在我的Ubuntu 18.04 操作系统上启动应用程序。 在浏览了文档之后,我发现QProcess 是最好的方法。 问题我正在尝试在最小的 GUI 上通过 QPushButton 启动应用程序,但它不起作用,并且我从编译器得到的错误是:

启动 LIDAR APP [EXEC] 已完成:0 QProcess::NormalExit [EXEC] 缓冲数据:“roslaunch:无进程 找到\n/home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh: 5: /home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh: roslaunch: 未找到\n"

这是我正在尝试启动的启动文件start_lidar_deck_rosbag.sh

#!/bin/bash

killall roslaunch && sleep 10
cd /home/emanuele/catkin_docking_ws/
roslaunch lidar_deck lidar_deck_rosbag.launch &

在最小的 GUI 下:

ma​​inwindow.h

class MainWindow : public QMainWindow

    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void startLidar();

private slots:
    void on_launchLidarROSBtn_clicked();

private:
    Ui::MainWindow *ui;
    QProcess *executeROSLidarApp;

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)

    ui->setupUi(this);
    startLidar();


MainWindow::~MainWindow()

    delete ui;


void MainWindow::startLidar()

    // Execution of the QProcess to make sure Lidar App Launcher opens:
    this->executeROSLidarApp = new QProcess(this);
    this->executeROSLidarApp->setProcessChannelMode(QProcess::MergedChannels);
    connect(this->executeROSLidarApp, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
            [script = this->executeROSLidarApp](int exitCode, QProcess::ExitStatus exitStatus)
            qDebug() << "[EXEC] FINISHED: " << exitCode << exitStatus;
            if(script->bytesAvailable() > 0) qDebug() << "[EXEC] buffered DATA:" << script->readAll();
    );
    connect(this->executeROSLidarApp, &QProcess::errorOccurred, [script = this->executeROSLidarApp](QProcess::ProcessError error) 
            qDebug() << "[EXEC] error on execution: " << error << script->errorString();
    );



void MainWindow::on_launchLidarROSBtn_clicked()

    qDebug() << "Launching LIDAR APP";
    this->executeROSLidarApp->start(QStringLiteral("/bin/sh"), QStringList() << QStringLiteral("/home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh"));

为了解决这个问题,我研究了很多可能的解决方案。 我咨询了this post 和this one。它们对于设置这个想法的主要部分很有用,但由于某些原因,我无法捕捉到这个过程似乎没有开始,我不明白为什么编译器会给出我上面提到的错误,如果我确定的话该文件 100% 存在。

请阐明并指出解决此问题的正确方向。

【问题讨论】:

进程 (bin/sh) 正在启动和执行脚本。似乎脚本本身导致了问题。所以,你的 c++ 代码很好。 【参考方案1】:

您的代码正在正确执行,它正在启动/bin/sh 并执行脚本,并且正在优雅地完成而没有错误。是你的脚本失败了。

您可以尝试以下方法:

确保进程roslaunch存在,这是明显的错误 您的脚本以#!bin/bash 开头,但您在QProcess 中执行/bin/sh。将其更改为#!/bin/sh

PS:

你不需要这样做

 QStringList() << QStringLiteral("/home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh")

相反,您可以只使用 initializer_list 语法

 QStringList("/home/emanuele/catkin_docking_ws/src/lidarboatsproject/start_lidar_deck_rosbag.sh");

【讨论】:

感谢您访问并阅读问题。我尝试了您的两种解决方案,但不幸的是它仍然无法正常工作 不管怎样,这里的问题不在于QProcess,而在于脚本。也许您应该尝试直接在终端中运行脚本,看看它是否正确执行?

以上是关于QProcess 无法启动进程:未找到进程的主要内容,如果未能解决你的问题,请参考以下文章

QProcess 失效且无法重新启动

Qt通过QProcess启动进程并传递命令行参数

Qt通过QProcess启动进程并传递命令行参数

QT软件开发: QProcess启动进程完成交互并获取输出

QProcess 终止进程树

如何在 Windows 上通过 QProcess 启动提升的子进程?