crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Проблема с установкой PATH в QProcess::setEnvironment
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
SABROG Дата 23.2.2010, 12:12
  В Qt 4.6 появился новый класс QProcessEnvironment

для ранних версий можно использовать не документированные функции qgetenv, qputenv о которых я писал давно в теме "Секреты и интересные возможности Qt"
zloyGamer Дата 23.2.2010, 10:45
  а можно заранее сформировать батник aga.bat - где все будет разложено по полочкам, типа:
Цитата
SET PATH=%PATH%;/path/to/git/;
git status

process->start(QString("cmd.exe aga.bat"));

или формировать этот батник из твоей программы и запускать ))
BRE Дата 23.2.2010, 10:02
 
Цитата(Litkevich Yuriy @ 23.2.2010, 9:53) *
просто это менее гибко на мой взгляд, чем использование переменной окружения PATH

Почему, пользователь не задал в PATH путь до git, значит оно ему не надо. :)
Можно попробовать добавлять свой путь в окружение и запускать git через командный интерпретатор, как-то так:
process->start(QString("cmd.exe git status"));


Тогда установленное окружение будет доступно в cmd и он будет их использовать для запуска git, но возможны другие трудности, например, с пайпами.
Litkevich Yuriy Дата 23.2.2010, 9:53
 
Цитата(BRE @ 23.2.2010, 12:45) *
process->start(QString("/path/to/git/git status"));
ну я сейчас почти так и делаю:
QString cmd = QString("%1\\git status").arg(m_gitPath);
process->start(cmd);

просто это менее гибко на мой взгляд, чем использование переменной окружения PATH
BRE Дата 23.2.2010, 9:45
 
Цитата(Litkevich Yuriy @ 23.2.2010, 9:41) *
Хорошо, а возможно ли как-то задать путь поиска?
в QProcess я вообще минимум функциональности вижу, скудноватый он какой-то.

process->start(QString("/path/to/git/git status"));
Litkevich Yuriy Дата 23.2.2010, 9:41
  Хорошо, а возможно ли как-то задать путь поиска?
в QProcess я вообще минимум функциональности вижу, скудноватый он какой-то.
BRE Дата 23.2.2010, 9:28
  Твое окружение передается запускаемому процессу (git), но оно никак не используется для твоем приложении, т.е. для поиска git.exe оно не используется.
Litkevich Yuriy Дата 23.2.2010, 6:16
  Наткнулся на проблему, суть которой понять не могу. С помощью 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;
        }
    }

}


Окружение устанавливается перед process->start, это наверняка, так как выводил отладку:
qDebug() << "Create process: git status, ENV\n" << process->environment();

Т.е. установка пути в PATH ни даёт ни какого эффекта, почему?

----
Виндовоз, Qt 4.4.3, MinGW32
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:57