Наткнулся на проблему, суть которой понять не могу. С помощью QProcess хочу запустить консольную программу (git status). Однако в стандартном окружении (а именно в PATH) нет пути к её бинарю. Хотел добавить этот путь для QProcess с помощью QProcess::setEnvironment. Окружение изменяется, но git не запускается. Т.е. делаю так:
1) запускаю свою программу в командной строке (на Виндовозе), в ответ получаю своё отладочное сообщение "Process \"git status\" may not started"
2) В командной строке устанавливаю новое значение PATH (set PATH=%PATH%;path/to/git/bin;), а затем запускаю свою программу - она запускает git.
Как делаю в коде? Отдельная фукция для задания пути к git'у:
void YGit::setGitPath(QString path)
{
m_gitPath = path;
QStringList env = QProcess::systemEnvironment();
env.replaceInStrings(QRegExp("^PATH=(.*)", Qt::CaseInsensitive), QString("PATH=\\1;%1").arg(path));
process->setEnvironment(env);
}
Сам код запуска git'а:QString YGit::status()
{
QString outString;
process->setProcessChannelMode(QProcess::MergedChannels);
process->start(QString("git status"));
if (!process->waitForStarted()){
qDebug() << "Process \"git status\" may not started";
return QString();
}
QTime t;
t.start();
int sec = 1000; // 1000 ms
int min = 60* sec; // 60 s
while(1){
if (process->waitForReadyRead(3 * min)){
outString += QString::fromLocal8Bit(process->readAllStandardOutput().data());
}
if (process->state() != QProcess::Running)
return outString;
if (t.elapsed() >= 5 * min){
qDebug() << "Process \"git status\" may not finished";
return outString;
}
}
}
qDebug() << "Create process: git status, ENV\n" << process->environment();
Твое окружение передается запускаемому процессу (git), но оно никак не используется для твоем приложении, т.е. для поиска git.exe оно не используется.
Хорошо, а возможно ли как-то задать путь поиска?
в QProcess я вообще минимум функциональности вижу, скудноватый он какой-то.
process->start(QString("/path/to/git/git status"));
QString cmd = QString("%1\\git status").arg(m_gitPath);
process->start(cmd);
process->start(QString("cmd.exe git status"));
а можно заранее сформировать батник aga.bat - где все будет разложено по полочкам, типа:
В Qt 4.6 появился новый класс http://doc.trolltech.com/4.6-snapshot/qprocessenvironment.html#systemEnvironment
для ранних версий можно использовать не документированные функции qgetenv, qputenv о которых я писал давно в теме "Секреты и интересные возможности Qt"
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)