注意到:这是一个特定用途的问题,但我希望其他人也可以从中受益
要基本了解我想要做的事情:
QProcess通过以下方式运行命令:
QProcess::start("sh -c \"cd /tmp/tempdir ; ./my_script --option file.txt ; echo $?\" ")
脚本需要用户输入(密码),QProcess::readAll()
确认脚本的输入请求。输入由QProcess::write()
给出。
我迷路了! - >没有收到输出。来自readAll()
和readAllStandardOutput()
,两者都是空的。
我需要输出,尤其是echo $?
以供稍后处理,但是由于readAll()
和readAllStandardOutput()
返回空字符串
对我来说,有几个可能导致这种情况的问题,可能不止一个:
守则:
//请忽略代码的混乱,放置一些调试只是为了看代码响应。
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
我希望这有意义,有什么建议我可以尝试解决这个问题吗?