与QProcess交互 - 读取和写入QProcess结果没有输出

时间:2017-01-25 00:00:39

标签: c++ qt stdin cin qprocess

注意到:这是一个特定用途的问题,但我希望其他人也可以从中受益

要基本了解我想要做的事情:

QProcess通过以下方式运行命令:

QProcess::start("sh -c \"cd /tmp/tempdir ; ./my_script --option file.txt ; echo $?\" ")

脚本需要用户输入(密码),QProcess::readAll()确认脚本的输入请求。输入由QProcess::write()给出。

我迷路了! - >没有收到输出。来自readAll()readAllStandardOutput(),两者都是空的。

我需要输出,尤其是echo $?以供稍后处理,但是由于readAll()readAllStandardOutput()返回空字符串

对我来说,有几个可能导致这种情况的问题,可能不止一个:

  • 脚本未收到此输入
  • 脚本接收输入,但需要“返回按键”
  • 脚本接收输入,QProcess :: write自动执行“返回键按”,脚本继续并完成,但QProcess不读取此输出

守则:

//请忽略代码的混乱,放置一些调试只是为了看代码响应。

  

cmd =“cd / tmp / tempdir; ./my_script --option file.txt; echo $?” (没有引号)

     

input =>脚本所需的输入

QString gen_serv::runCommand(QString cmd, QString input){
    Process *p = new QProcess(parent);
    p->setProcessChannelMode(QProcess::MergedChannels);
    //    p->start("sh ", QStringList() << " -c " << cmd);
    QString c = QString("sh -c \"" + cmd + "\" ");
    p->start(c);                                                <---- ACTUAL COMMAND : sh -c "cd /tmp/tempdir ; ./my_script --option file.txt ; echo $?"
    if (p->waitForStarted()) {
        if (!p->waitForReadyRead()) {
            qDebug(log_lib_gen_serv) << "waitForReadyRead() [false] : CODE: " << QVariant(p->error()).toString() << " | ERROR STRING: " << p->errorString();
        }
        if (!p->waitForFinished(1000)) {
            qDebug() << p->readAll();
            qDebug() << p->readAllStandardOutput();
            //p->write(input.toLatin1());
            p->write(QString(input + QString("\n")).toLatin1());           <--- added this "\n" incase the process/console was waiting for a return press, thus the /n should satisfy the return requirement
            qDebug() << p->readAll();
            qDebug() << p->readAllStandardOutput();
            if (!p->waitForFinished()) {
                qDebug() << p->readAll();
                qDebug() << p->readAllStandardOutput();
                qDebug(log_lib_gen_serv) << "waitForFinished() [false] : CODE: " << QVariant(p->error()).toString() << " | ERROR STRING: " << p->errorString();
            }
            qDebug() << p->readAll();
            qDebug() << p->readAllStandardOutput();
        }
        QString s = QString(p->readAll() + p->readAllStandardOutput());
        return s;
    }
    else{
        qDebug(log_lib_gen_serv) << "waitForStarted() [false] : CODE: " << QVariant(p->error()).toString() << " | ERROR STRING: " << p->errorString();
    }
    p->waitForFinished();
    p->kill();
    return QString();
}

请注意:

脚本冗长而复杂,但如果成功执行则返回“完成”消息,并为每种情况返回退出代码。

因此echo $?应捕获并返回此内容以进行处理,即return s

我希望这有意义,有什么建议我可以尝试解决这个问题吗?

0 个答案:

没有答案