crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблема с установкой PATH в QProcess::setEnvironment
Litkevich Yuriy
  опции профиля:
сообщение 23.2.2010, 6:16
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Наткнулся на проблему, суть которой понять не могу. С помощью 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.2.2010, 9:28
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Твое окружение передается запускаемому процессу (git), но оно никак не используется для твоем приложении, т.е. для поиска git.exe оно не используется.

Сообщение отредактировал BRE - 23.2.2010, 9:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.2.2010, 9:41
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Хорошо, а возможно ли как-то задать путь поиска?
в QProcess я вообще минимум функциональности вижу, скудноватый он какой-то.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.2.2010, 9:45
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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

process->start(QString("/path/to/git/git status"));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.2.2010, 9:53
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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, 10:02
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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

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


Тогда установленное окружение будет доступно в cmd и он будет их использовать для запуска git, но возможны другие трудности, например, с пайпами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zloyGamer
  опции профиля:
сообщение 23.2.2010, 10:45
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 18.7.2009
Пользователь №: 917

Спасибо сказали: 0 раз(а)




Репутация:   0  


а можно заранее сформировать батник aga.bat - где все будет разложено по полочкам, типа:
Цитата
SET PATH=%PATH%;/path/to/git/;
git status

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

или формировать этот батник из твоей программы и запускать ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.2.2010, 12:12
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


В Qt 4.6 появился новый класс QProcessEnvironment

для ранних версий можно использовать не документированные функции qgetenv, qputenv о которых я писал давно в теме "Секреты и интересные возможности Qt"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 9.7.2020, 7:42