crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 1:34