crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблемы с environment дочернего приложения
mva
  опции профиля:
сообщение 28.10.2010, 22:36
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Доброго времени суток всем!

Мое приложение работает с PostgreSQL и во время работы вызывает консольное приложение psql для выполнения некоторых операций с сервером.
Консольное приложение запускается следующим образом:
                    QProcess* proc = new QProcess();
                    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
                    env.insert("PGPASSWORD", password);
                    proc->setProcessEnvironment(env);
                    if (proc->execute("psql", QStringList()  << "-U" << "postgres" << "-f" << initScriptFileName << lastDbName) >= 0)
                        lResult = true;
                    else
                        app->showError(QObject::tr("Не удалось запустить psql"));


Проблема в том, что программа зависает на команде execute. Т.е. консольное приложение не выполняется, т.к. ждет ввода пароля, который передать через параметры в утилиту нельзя. В моем случае по идее пароль передается через среду окружения.
Если смотреть отладчиком QtCreator'а, то переменная PGPASSWORD как будто создается, но при проверке ProcessExplorer'ом этой переменной в среде окружения psql нет. Если создать эту переменную вручную через свойства ярлычка "Мой компьютер", то все работает нормально.

Под Linux все работает нормально.


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.10.2010, 23:07
Сообщение #2


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

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

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




Репутация:   94  


Цитата(mva @ 29.10.2010, 1:36) *
но при проверке ProcessExplorer'ом этой переменной в среде окружения psql нет.
и не будет. он ничего не знает о локальном окружении. только о том в котором он сам запущен.

Попробуй открыть командную строку, задать в ней переменную окружения и выполнить программу psql. Будет ли работать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 29.10.2010, 7:52
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.10.2010, 0:07) *
Попробуй открыть командную строку, задать в ней переменную окружения и выполнить программу psql. Будет ли работать?


Да, так работает. А чем можно посмотреть переменные окружения дочернего процесса?


Сообщение отредактировал mva - 29.10.2010, 7:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 30.10.2010, 14:21
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Все, проблему удалось решить таким кодом:

                    QProcess* proc = new QProcess();
                    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
                    env.insert("PGPASSWORD", password);
                    proc->setProcessEnvironment(env);
                    proc->start("psql", QStringList()  << "-U" << "postgres" << "-f" << initScriptFileName << lastDbName);
                    if (!proc->waitForStarted())
                        app->showError(QObject::tr("Не удалось запустить psql"));
                    else
                        if (proc->waitForFinished())
                            lResult = true;


Всем спасибо за внимание.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 3.12.2024, 10:54